Swift: AWS SDK for iOS 2.0を使ってS3にファイルをアップロード
AWS SDK for iOS 2.0 (まだ Developer Preview だが) を使って Amazon S3 にファイルをアップロードする処理を書いていたのだがなかなかうまくいかなくて、もしやと思ってバケットのリージョンを US Standard (US East 1) にしてみたら成功した。1時間以上ハマってしまった。
AWS SDK for iOS 2.0 のドキュメントでは Amazon Cognito というモバイル向けのID管理システムのようなものとあわせて利用することが推奨されていてその通りにコードを書いていたのだが、どうやら Amazon Cognito の Identity Pool がまだ US East 1 のリージョン上でしか作成できないがゆえに、 AWS SDK から提供されている AWSS3TransferManager とあわせて使うときにはリージョンを合わせないといけない。(ということだろうか?)
以下、与えられたファイルパスのファイルを S3 にアップロードするサンプルコード。言語は Swift。
※ 事前に Set Up the SDK for iOS – AWS SDK for iOS 2.0 にあるセットアップをおこなっておくこと。
// 以下のコードは AppDelegate.swift の application:didFinishLaunchingWithOptions に書く let credentialsProvider = AWSCognitoCredentialsProvider.credentialsWithRegionType( .USEast1, accountId: "your account id", identityPoolId: "your identity pool id", unauthRoleArn: "unauth role arn", authRoleArn: "auth role arn" ) let configuration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: credentialsProvider) AWSServiceManager.defaultServiceManager().setDefaultServiceConfiguration(configuration)
func uploadToS3(filePath: String!) { let transferManager = AWSS3TransferManager.defaultS3TransferManager() var uploadRequest = AWSS3TransferManagerUploadRequest() uploadRequest.bucket = "your bucket name" uploadRequest.key = "your file name" uploadRequest.body = NSURL.fileURLWithPath(filePath) uploadRequest.ACL = .PublicRead transferManager.upload(uploadRequest).continueWithExecutor( BFExecutor.mainThreadExecutor(), withBlock: { (task: BFTask!) in if task.error() == nil { // アップロード成功時の処理 } else { // エラー時の処理 } return nil } ) }
なお Amazon Cognito で Identity Pool を作成する際に専用の IAM Role を作ることになるので、IAM のコンソール画面からそのロールに対して S3 へのフルアクセス権限を与えておく必要がある。
» How to Upload Files from Your App to the Cloud – AWS SDK for iOS 2.0
» Version 2 of the AWS SDK for iOS Developer Preview – AWS Developer Blog – Mobile
コメントを残す