[小ネタ] CloudShell で AWS Lambda の Java アプリを作成してみた

[小ネタ] CloudShell で AWS Lambda の Java アプリを作成してみた

AWS のサンプルアプリケーション「java-events」を AWS CloudShell で構築しました
Clock Icon2025.03.03

アノテーション・テクニカルサポートチームの 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 のリソースに遷移します。

Cloudshell Lambda Java App Creation 1

ランタイム設定セクションの「編集」からハンドラを変更します。

Cloudshell Lambda Java App Creation 2

希望する AWS サービスのハンドラに変更します。

※選択できるハンドラはsrc/main/java/exampleから確認できます

Cloudshell Lambda Java App Creation 6

ハンドラが正常に更新されたことを確認します。

Cloudshell Lambda Java App Creation 7

動作確認用スクリプトのパラメータを、選択したサービスに変えて動作確認します。

※サービス名は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

参考資料

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイト をぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.