Spring Cloud Function(Java 21)+Datadog APM 対応の Lambda サンプルです。
コンテナイメージ運用と ZIP 配布の両方に対応しています。
src/main/java/com/example/LambdaHandlerApplication.java: 関数本体(手動スパン付きと自動計測の2種類を提供)build.gradle: Gradle ビルド設定Dockerfile: マルチステージ。builder で Gradle ビルドし、runner に成果物と Datadog を同梱
※ Lambda を arm64 で使う想定。x86_64 の場合は --platform linux/amd64 を付けてください。
DOCKER_BUILDKIT=0 docker build -t <ECR-URI>:latest .
docker push <ECR-URI>:latest(Dockerfile 内で gradle clean jar copyRuntimeLibs を実行するため、事前にローカルでビルドする必要はありません)
- ラッパーがない場合は作成(Gradleがインストール済みなら wrapper を省略して
gradleでも可)gradle wrapper --gradle-version 8.10.2 --distribution-type=bin chmod +x gradlew
- ZIP を生成
生成物:
gradle clean lambdaZip
build/distributions/spring_cloud_function_dd_sample-0.1.0-lambda.zip - Lambda にコード更新(ZIP)
aws lambda update-function-code \ --function-name <FUNCTION_NAME> \ --region <REGION> \ --zip-file fileb://build/distributions/spring_cloud_function_dd_sample-0.1.0-lambda.zip
- Lambda 設定
- ランタイム: Java 21
- ハンドラ:
org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest - 環境変数: Datadog (例)
AWS_LAMBDA_EXEC_WRAPPER=/opt/datadog_wrapper,DD_API_KEY,DD_SITEなど - (レイヤー運用する場合は dd-trace-java と Datadog-Extension をアーキテクチャに合わせて追加)
AWS CLI で直接 invoke します。--cli-binary-format raw-in-base64-out を付けて JSON を渡してください。
aws lambda invoke \
--function-name <FUNCTION_NAME> \
--region <REGION> \
--cli-binary-format raw-in-base64-out \
--payload '{"id":1}' \
/tmp/out.json
cat /tmp/out.jsonレスポンス例: {"id":1,"found":true,"item":{"id":1,"name":"alpha","status":"active"}}
- イメージURI: 上記でプッシュした ECR イメージ
- ハンドラ:
org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest - 環境変数(例)
AWS_LAMBDA_EXEC_WRAPPER=/opt/datadog_wrapperDD_SITE=datadoghq.comDD_API_KEY(本番では Secrets 等で注入)- 必要に応じて
DD_SERVICEDD_ENVなど
- Datadog Java Agent と Extension は Dockerfile で
/optに同梱済み。 - アーキテクチャは Lambda に合わせて
arm64を使用。
- タイムアウト/メモリは十分に確保(例: 1024MB / 15s 以上)
- イメージに依存JARと本体JARが含まれているかは
docker run --rm --entrypoint "" <image> sh -c 'ls /var/task/lib'で確認できます。