はじめに
こんにちは、初iOSの記事になります!
今回はSwiftでAWSのS3へ画像をアップロードする方法について、ブログを書きたいと思います。
AWS Cognitoでの認証が本来は望ましいのですが、今回は簡単にIAMユーザを作成し、ACCESS KEYとSECRET ACCESS KEYを利用した方法で紹介したいと思います。
アプリをリリースする場合は、AWS Cognitoを利用するか、IAMユーザの場合はアクセス権限を十分に絞ってください。
AWS上での事前準備
AWS上での準備については、省略しますが下記の2つを準備してください。
IAMユーザについては、作成したS3のバケットへアップロード(PutObject)できる権限を付与しておく必要があります。
- S3にバケットを作成
- IAMユーザの作成(上記のバケットへの「s3:PutObject」権限あり)
CocoaPodsでAWS SDKをインストールをする
Podfileに下記を記載して、インストールします。
1 2 3 | use_frameworks! pod 'AWSS3' |
1 | $ pod install |
認証の設定をする
冒頭で記載したとおり、今回はIAMユーザでの認証を行います。
accessKeyとsecretKeyにはAWSで作成したIAMユーザのものを設定してください。
下記の処理は、S3で画像などをアップロードする前に1度だけ実行するようにします。
1 2 3 4 5 6 7 8 | import AWSCore ... ... func configureService() { let credentialsProvider = AWSStaticCredentialsProvider(accessKey: "your access key", secretKey: "your secret key") let serviceConfiguration = AWSServiceConfiguration(region: AWSRegionType.apNortheast1, credentialsProvider: credentialsProvider) AWSServiceManager.default().defaultServiceConfiguration = serviceConfiguration } |
UIImageを保存して、URLを取得する
S3へ投稿するファイルは、一時的に端末内に保存して、そのURLをS3のSDKに指定する必要があります。
下記のメソッドで、S3へのアップロードする画像が保存されているURLを取得できます。
1 2 3 4 5 6 7 | private func generateImageUrl(_ uploadImage: UIImage) -> URL { let imageURL = URL(fileURLWithPath: NSTemporaryDirectory().appendingFormat("upload.jpg")) if let jpegData = UIImageJPEGRepresentation(uploadImage, 80) { try! jpegData.write(to: imageURL, options: [.atomicWrite]) } return imageURL } |
S3へアップロードする
下記のメソッドでS3へアップロードができます。
下記のメソッドを呼ぶ前には、上記で記載している認証の設定を事前に実行する必要があります。
また、「
uploadRequest?.bucket
」にはAWS上で作成したバケット名を指定し、「
uploadRequest?.key
」にはS3上に保存したいファイル名を指定します。
なお、ファイル名はtest/hello.jpgとするとAWSコンソールなどから見た際にtestフォルダ内にhello.jpgファイルが保存されているように見えるので、ファイルをまとめて管理したい場合には、「test/」などのプレフィックスをつけるとよいでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import AWSS3 ... ... public func uploadImage(_ uploadImage: UIImage) { let transferManager = AWSS3TransferManager.default() let uploadRequest = AWSS3TransferManagerUploadRequest() uploadRequest?.bucket = "your S3 bucket name" uploadRequest?.key = "your file name on S3" uploadRequest?.body = generateImageUrl(uploadImage) transferManager?.upload(uploadRequest).continue({ (task: AWSTask) -> Any? in if task.error != nil || task.exception != nil { // エラー } return nil }) } |
さいごに
直近のプロジェクトで、S3へ画像をアップロードする必要があったので調べてみました。
ぜひ、ご参考にしていただければと思います。