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に下記を記載して、インストールします。
use_frameworks!
pod 'AWSS3'
$ pod install
認証の設定をする
冒頭で記載したとおり、今回はIAMユーザでの認証を行います。accessKeyとsecretKeyにはAWSで作成したIAMユーザのものを設定してください。
下記の処理は、S3で画像などをアップロードする前に1度だけ実行するようにします。
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を取得できます。
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/」などのプレフィックスをつけるとよいでしょう。
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
})
}
0 件のコメント:
コメントを投稿