LoginSignup
3
2

More than 3 years have passed since last update.

KotlinでS3 → AWS Lambdaを動かす

Last updated at Posted at 2019-10-16

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側の設定で呼び出すクラス名を指定する。

スクリーンショット 2019-10-17 8.27.30.png

これを行わないと「handleRequestが見つからない」というエラーが発生するので注意。

参考

公式ライブラリ

aws/aws-lambda-java-libs
https://github.com/aws/aws-lambda-java-libs

Lambdaドキュメント

S3ドキュメント

Todo

GitHubにコードを載せる

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2