AWS Lambda Developer Guide内にあるsample-appsをやってみた

AWS Lambdaの理解を深めるために、AWS Lambda Developer Guide内にあるsample-appsをやってみることにしました。

github.com

言語ごとに複数のサンプルが格納されていますが、今回はblank-javaを試します。

環境準備が面倒くさかったのでCloud9上で試します。Cloud9上ではGradleがインストールされていないので、以下のコマンドを使ってインストールします。

curl -OL https://services.gradle.org/distributions/gradle-8.2.1-bin.zip

blank-javaには、1-create-bucket.sh2-build-layer.shといったそれぞれのスクリプトがあるので、基本的にはそれらを実行していけばLambda関数は動きます。が、それだと味気ないので、それぞれの処理の内容を深掘りしていきます。

1-create-bucket.sh

S3バケットを作成します。ここにLambda関数の本体を格納します。

2-build-layer.sh

レイヤーとして格納するライブラリを作成します。レイヤーとは以下のもの。

docs.aws.amazon.com

build.gradleにて定義されている以下のタスクを実行してレイヤーとして格納するライブラリを作成します。

task packageLibs(type: Zip) {
    into('java/lib') {
        from configurations.runtimeClasspath
    }
    dirMode = 0755
    fileMode = 0755
}

これで作成できるライブラリは以下のようなjarファイルが格納されています。

java/
java/lib/
java/lib/lambda-2.10.72.jar
java/lib/aws-xray-recorder-sdk-core-2.4.0.jar
java/lib/aws-lambda-java-core-1.2.1.jar
java/lib/aws-lambda-java-events-2.2.9.jar
java/lib/slf4j-nop-2.0.6.jar
java/lib/aws-json-protocol-2.10.72.jar
java/lib/protocol-core-2.10.72.jar
java/lib/aws-core-2.10.72.jar
java/lib/auth-2.10.72.jar
java/lib/regions-2.10.72.jar
java/lib/sdk-core-2.10.72.jar
java/lib/apache-client-2.10.72.jar
java/lib/netty-nio-client-2.10.72.jar
java/lib/http-client-spi-2.10.72.jar
java/lib/profiles-2.10.72.jar
java/lib/utils-2.10.72.jar
java/lib/annotations-2.10.72.jar
java/lib/aws-java-sdk-xray-1.11.398.jar
java/lib/aws-java-sdk-core-1.11.398.jar
java/lib/joda-time-2.8.1.jar
java/lib/slf4j-api-2.0.6.jar
java/lib/jmespath-java-1.11.398.jar
java/lib/jackson-databind-2.10.0.jar
java/lib/jackson-dataformat-cbor-2.6.7.jar
java/lib/jackson-core-2.10.0.jar
java/lib/netty-reactive-streams-http-2.0.4.jar
java/lib/netty-reactive-streams-2.0.4.jar
java/lib/reactive-streams-1.0.3.jar
java/lib/eventstream-1.0.1.jar
java/lib/jackson-annotations-2.10.0.jar
java/lib/httpclient-4.5.9.jar
java/lib/httpcore-4.4.11.jar
java/lib/netty-codec-http2-4.1.42.Final.jar
java/lib/netty-codec-http-4.1.43.Final.jar
java/lib/netty-handler-4.1.43.Final.jar
java/lib/netty-codec-4.1.43.Final.jar
java/lib/netty-transport-native-epoll-4.1.42.Final-linux-x86_64.jar
java/lib/netty-transport-native-unix-common-4.1.42.Final.jar
java/lib/netty-transport-4.1.43.Final.jar
java/lib/netty-buffer-4.1.43.Final.jar
java/lib/netty-resolver-4.1.43.Final.jar
java/lib/netty-common-4.1.43.Final.jar
java/lib/commons-logging-1.2.jar
java/lib/commons-codec-1.11.jar
java/lib/ion-java-1.0.2.jar

3-deploy.sh

JavaアプリをビルドしてLambdaをデプロイします。ビルドするとbuild/distributions/blank-java.zipというファイルが作成されます。このファイルは以下の通り非常にコンパクトなものです。

$ jar -tf build/distributions/blank-java.zip 
example/
example/Handler.class
previous-compilation-data.bin
$

Lambdaの作成はCloudFormationで生成されます。テンプレートはtemplate.ymlにあるので特に何もいじらなくても作成できます。

4-invoke.sh

作成したLambdaを起動します。無限ループになっているので動いたらCtrl+Cとかで止めます。

5-cleanup.sh

作成したLambdaやS3 Bucketなどを削除します。

実際に動くアプリはsrc/main/java/example/Handler.javaにあります。ドキュメントにあるものと合わせて何をやっているのかを理解します。

docs.aws.amazon.com

必要な要素はblank-javaにあるので、これをもとに自分用にカスタマイズするとよさそうです。