[小ネタ] CloudShell で AWS Lambda の Java アプリを作成してみた
アノテーション・テクニカルサポートチームの hato です。
AWS Lambda で AWS サービスイベントを受け取る Java アプリを作成する機会がありましたので、小ネタとして紹介します。
AWS Lambda Developer Guide のサンプルアプリケーション
AWS の GitHub には Lambda で動く Java のサンプルアプリケーションが数多く公開されています。
今回構築するjava-eventsは次の AWS サービスのイベントを処理するシンプルなアプリケーションで、対応するサービス毎に用意された Lambda のハンドラ名を切り替えて利用します。
- API Gateway(HTTP/REST)
- CloudFront
- CodeCommit
- Cognito
- Config
- CloudWatch Events
- CloudWatch Logs
- DynamoDB
- Kinesis Firehose
- Kinesis
- Lex
- S3
- SNS
- SQS
基本的にはREADME.md
の通りに、用意されたビルド・構築用のスクリプトを実行しますが、いくつか注意点がありますのでご注意ください。
また、今回は AWS CloudShell で各コマンドを実行しています。
やってみた
動作要件ソフトウェアのインストール
AWS CloudShell を起動して、yum コマンドで Java 11 をインストールします。
※README.md
では Java 8 が要件ですが、コード類が Java 11 に更新されているため Java 11 をインストール
$ sudo yum install -y java-11-amazon-corretto
...(中略)...
Complete!
Java 11 のインストールを確認します。
$ java -version
openjdk version "11.0.26" 2025-01-21 LTS
OpenJDK Runtime Environment Corretto-11.0.26.4.1 (build 11.0.26+4-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.26.4.1 (build 11.0.26+4-LTS, mixed mode)
Gradle 5 のバイナリをダウンロードしてインストールします。
$ wget https://services.gradle.org/distributions/gradle-5.6.4-bin.zip
...(中略)...
2025-03-03 01:32:41 (172 MB/s) - ‘gradle-5.6.4-bin.zip’ saved [93900716/93900716]
$ sudo mkdir /opt/gradle
$ sudo unzip -d /opt/gradle gradle-5.6.4-bin.zip
$ export PATH=$PATH:/opt/gradle/gradle-5.6.4/bin
$ rm gradle-5.6.4-bin.zip
Gradle 5 のインストールを確認します。
$ gradle -v
Welcome to Gradle 5.6.4!
Here are the highlights of this release:
- Incremental Groovy compilation
- Groovy compile avoidance
- Test fixtures for Java projects
- Manage plugin versions via settings script
For more details see https://docs.gradle.org/5.6.4/release-notes.html
------------------------------------------------------------
Gradle 5.6.4
------------------------------------------------------------
Build time: 2019-11-01 20:42:00 UTC
Revision: dd870424f9bd8e195d614dc14bb140f43c22da98
Kotlin: 1.3.41
Groovy: 2.5.4
Ant: Apache Ant(TM) version 1.9.14 compiled on March 12 2019
JVM: 11.0.26 (Amazon.com Inc. 11.0.26+4-LTS)
OS: Linux 6.1.127-135.201.amzn2023.x86_64 amd64
コードのビルドとデプロイ
GitHub からリポジトリをクローンして、スクリプトのあるファイルパスに移動します。
$ git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
...(中略)...
Resolving deltas: 100% (8356/8356), done.
$ cd aws-lambda-developer-guide/sample-apps/java-events
コード一時保管用の S3 バケットを作成するスクリプトを実行します。
※出力される名前(例:lambda-artifacts-hato
)の S3 バケットが作成されます。
$ ./1-create-bucket.sh
make_bucket: lambda-artifacts-hato
コードをビルドしてデプロイするスクリプトを実行します。
※ビルドから CloudFormation によるデプロイまで全自動で実施されます。
$ ./2-deploy.sh
...(中略)...
BUILD SUCCESSFUL in 36s
6 actionable tasks: 6 executed
Uploading to 954577dc3d2f336ba33eda57ff4cb5d0 1179597 / 1179597.0 (100.00%)
Successfully packaged artifacts and wrote output template to file out.yml.
Execute the following command to deploy the packaged template
aws cloudformation deploy --template-file /home/cloudshell-user/aws-lambda-developer-guide/sample-apps/java-events/out.yml --stack-name <YOUR STACK NAME>
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - java-events
動作確認
デプロイまで完了したら動作確認用のスクリプトで動作確認します。
デフォルトでは SQS 用のハンドラが指定されていたため、SQS のイベントで動作確認します。
※Hello from SQS!
が確認できれば正常です
$ ./3-invoke.sh sqs
{
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
["Hello from SQS!"]
ハンドラ名を切り替える
SQS 以外のイベントを受け取る場合は、 Lambda 関数のハンドラを切り替えます。
Lambda 関数は CloudFormation で構築されているため CloudFormation コンソールからスタック名:java-events
を探し、Lambda のリソースに遷移します。
ランタイム設定セクションの「編集」からハンドラを変更します。
希望する AWS サービスのハンドラに変更します。
※選択できるハンドラはsrc/main/java/exampleから確認できます
ハンドラが正常に更新されたことを確認します。
動作確認用スクリプトのパラメータを、選択したサービスに変えて動作確認します。
※サービス名はREADME.md
から確認できます
# コマンド形式
$ ./3-invoke.sh <サービス名>
# コマンド例
$ ./3-invoke.sh s3
{
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
"BUCKET_NAME/inbound/sample-java-s3.png"
削除
不要になった場合は削除用のスクリプトを実行します。
削除するリソースは選択できるので、残す場合はn
を選択します。
$ ./4-cleanup.sh
Deleted java-events stack.
Delete deployment artifacts and bucket (lambda-artifacts-hato)? (y/n) y
delete: s3://lambda-artifacts-hato/954577dc3d2f336ba33eda57ff4cb5d0
remove_bucket: lambda-artifacts-hato
Delete function log group (/aws/lambda/java-events-function-ItJh08zqRfwS)? (y/n) y
参考資料
- AWS Lambda の Java サンプルアプリケーション - AWS Lambda
- aws-lambda-developer-guide/sample-apps/java-events at main · awsdocs/aws-lambda-developer-guide · GitHub
- Java による Lambda 関数の構築 - AWS Lambda
- AWS CloudShell の開始方法 - AWS CloudShell
- Amazon Corretto 11 のインストール手順、RPM ベース Linux、Alpine Linux ディストリビューション - Amazon Corretto
- Gradle | Installation
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイト をぜひご覧ください。