S3にアップロード → Lambda起動 → S3内容取得
という流れをKotlinで書いた。
build.gradle
ライブラリは以下が必要
dependencies {
// AWS
implementation 'com.amazonaws:aws-lambda-java-core:1.2.0'
implementation 'com.amazonaws:aws-lambda-java-events:1.3.0'
implementation 'com.amazonaws:aws-java-sdk-s3:1.11.647'
- aws-lambda-java-core
- Lambdaから呼び出されるメソッドを作成するために必要
- aws-lambda-java-events
- LambdaでS3のイベントを受け取れる
- aws-java-sdk-s3
- S3のオブジェクトにアクセスする
Lambdaコード
クラスにRequestHandler
を継承し、Lambdaから呼び出されるhandleRequest()
メソッドを追加する。
(詳細は公式を参照すべし)
handleRequest
の引数にS3Event
を指定するとS3のイベントを受け取れる。
あとはS3のkey(ファイル名?)を取得し、S3の中身を取り出していく。
class QiitaLambdaHandler : RequestHandler<S3Event, Output> {
override fun handleRequest(event: S3Event, context: Context?): Output {
// AWSの認証作成
val credentials: AWSCredentials = BasicAWSCredentials(
// アクセスキー
"ACCESS_KEY",
// シークレットキー
"SECRET_KEY"
)
// S3にアクセスするクライアント
val client = AmazonS3ClientBuilder
.standard()
.withCredentials(AWSStaticCredentialsProvider(credentials))
.withRegion(Regions.US_EAST_1)
.build()
// S3のキーを取得
val s3Keys = event.records.map { it.s3.`object`.key }
// 取得したS3のキーでループ
s3Keys.forEach { key ->
val request = GetObjectRequest("BUCKET_NAME", key)
val file = File("/tmp") // 保存したいパス
try {
// 取得方法1 - S3をファイルに保存
client.getObject(request, file) // fileのパスにS3が保存される
// 取得方法2 - S3を変数に格納
val data = client.getObjectAsString("BUCKET_NAME", key)
// あとは取得したS3内容を好きなように処理する
} catch (e: Exception) {
return Output(
statusCode = 500,
message = "Unknown error."
)
}
}
return Output(
statusCode = 200,
message = "Process has been passed through."
)
}
}
あとはコードを固めてLambdaにアップロードし、Lambda側の設定で呼び出すクラス名を指定する。
これを行わないと「handleRequestが見つからない」というエラーが発生するので注意。
参考
公式ライブラリ
aws/aws-lambda-java-libs
https://github.com/aws/aws-lambda-java-libs
Lambdaドキュメント
S3ドキュメント
Todo
GitHubにコードを載せる