AWS Lambdaの理解を深めるために、AWS Lambda Developer Guide内にあるsample-appsをやってみることにしました。
言語ごとに複数のサンプルが格納されていますが、今回はblank-java
を試します。
環境準備が面倒くさかったのでCloud9上で試します。Cloud9上ではGradleがインストールされていないので、以下のコマンドを使ってインストールします。
curl -OL https://services.gradle.org/distributions/gradle-8.2.1-bin.zip
blank-java
には、1-create-bucket.sh
や2-build-layer.sh
といったそれぞれのスクリプトがあるので、基本的にはそれらを実行していけばLambda関数は動きます。が、それだと味気ないので、それぞれの処理の内容を深掘りしていきます。
1-create-bucket.sh
S3バケットを作成します。ここにLambda関数の本体を格納します。
2-build-layer.sh
レイヤーとして格納するライブラリを作成します。レイヤーとは以下のもの。
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
にあります。ドキュメントにあるものと合わせて何をやっているのかを理解します。
必要な要素はblank-java
にあるので、これをもとに自分用にカスタマイズするとよさそうです。