aws-lambda-java-integration について
JavaでAWS Lambda関数を開発するためのスキルです。Micronautと素のJavaの実装パターンを扱い、コールドスタート最適化、API GatewayまたはALB連携、テスト、デプロイ設定を説明します。
主な機能
- 01Micronautと素のJavaの実装パターン
- 02コールドスタート最適化の指針
- 03API GatewayとALBの連携
- 04Serverless FrameworkとAWS SAMの設定
- 05テストとCI/CDの例
活用シーン
- 01Java AWS Lambda関数の開発
- 02実装方式の選択
- 03Lambdaのコールドスタート短縮
- 04Lambdaデプロイパイプラインの準備
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ giuseppe-trisciuoglio/ developer-kit --skill aws-lambda-java-integrationインストール後、Claude Code で/aws-lambda-java-integrationを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/micronaut-lambda.mdraw-java-lambda.mdserverless-deployment.mdtesting-lambda.md詳細
AWS Lambda Java 統合
コールドスタートを最適化した、高性能な Java AWS Lambda 関数を作成するためのパターンです。
概要
このスキルでは、AWS Lambda Java の開発に関する包括的なパターンを紹介します。主に次の 2 つのアプローチを扱います。
- Micronaut Framework — AOT コンパイルと依存性注入に対応した高機能なフレームワークで、コールドスタートは 1 秒未満です
- Raw Java — オーバーヘッドを最小限に抑えるアプローチで、コールドスタートは 500 ミリ秒未満です
どちらのアプローチも、本番環境向けの設定で API Gateway と ALB の統合に対応しています。
使用する場面
- Java 関数を AWS Lambda にデプロイするとき
- コールドスタートを 1 秒未満に最適化するとき
- Micronaut と Raw Java のどちらのアプローチを使うか選ぶとき
- API Gateway または ALB の統合を設定するとき
- Java Lambda 用の CI/CD パイプラインを構築するとき
手順
1. アプローチを選択する
| アプローチ | コールドスタート | 適した用途 | 複雑さ |
|---|---|---|---|
| Micronaut | 1 秒未満 | 複雑なアプリ、DI が必要な場合、エンタープライズ | 中 |
| Raw Java | 500 ミリ秒未満 | シンプルなハンドラー、オーバーヘッドを最小限にしたい場合 | 低 |
確認:作業を進める前に、選んだアプローチが用途に合っていることを確認します。
2. プロジェクト構成
my-lambda-function/
├── build.gradle (or pom.xml)
├── src/main/java/com/example/Handler.java
└── serverless.yml (or template.yaml)
確認:プロジェクト構成がテンプレートと一致していることを確認します。
3. 実装例
Micronaut ハンドラー
@FunctionBean("my-function")
public class MyFunction implements Function<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
private final MyService service;
public MyFunction(MyService service) {
this.service = service;
}
@Override
public APIGatewayProxyResponseEvent apply(APIGatewayProxyRequestEvent request) {
// Process request
return new APIGatewayProxyResponseEvent()
.withStatusCode(200)
.withBody("{\"message\": \"Success\"}");
}
}
Raw Java ハンドラー
public class MyHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {
private static final MyService service = new MyService();
@Override
public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent request, Context context) {
return new APIGatewayProxyResponseEvent()
.withStatusCode(200)
.withBody("{\"message\": \"Success\"}");
}
}
確認:デプロイ前に sam local invoke を実行し、ハンドラーが動作することを確認します。
基本パターン
接続管理
// Initialize once, reuse across invocations
private static final DynamoDbClient dynamoDb = DynamoDbClient.builder()
.region(Region.US_EAST_1)
.build();
// Avoid: Creating clients in handler (slow on every invocation)
エラー処理
@Override
public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent request, Context context) {
try {
return successResponse(process(request));
} catch (ValidationException e) {
return errorResponse(400, e.getMessage());
} catch (Exception e) {
context.getLogger().log("Error: " + e.getMessage());
return errorResponse(500, "Internal error");
}
}
ベストプラクティス
設定
- メモリ:512MB から始め、プロファイリングに基づいて調整します
- タイムアウト:Micronaut は 10~30 秒、Raw Java は 5~10 秒に設定します
- ランタイム:最高のパフォーマンスを得るには Java 17 または 21 を使用します
パッケージ化
- Gradle Shadow Plugin または Maven Shade Plugin を使用します
- 不要な依存関係を除外します
モニタリング
- パフォーマンス分析のために X-Ray トレーシングを有効にします
- CloudWatch Insights を使用して、コールドスタートとウォームスタートを追跡します
デプロイの選択肢
Serverless Framework
service: my-java-lambda
provider:
name: aws
runtime: java21
memorySize: 512
timeout: 10
package:
artifact: build/libs/function.jar
functions:
api:
handler: com.example.Handler
events:
- http:
path: /{proxy+}
method: ANY
確認:まず --stage dev を指定して serverless deploy を実行します。
AWS SAM
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
MyFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: build/libs/function.jar
Handler: com.example.Handler
Runtime: java21
MemorySize: 512
Timeout: 10
Events:
ApiEvent:
Type: Api
Properties:
Path: /{proxy+}
Method: ANY
確認:デプロイ前に sam validate を実行します。
制約と注意事項
Java 固有の制約
- リフレクション:使用を最小限に抑え、AOT コンパイル(Micronaut)を優先します
- クラスパススキャン:コールドスタートを遅くするため、明示的に設定します
- 大規模なフレームワーク:Spring Boot はコールドスタートのオーバーヘッドを大幅に増加させます
よくある落とし穴
- ハンドラー内での初期化 — ウォーム状態の呼び出しでも処理が繰り返されます
- サイズの大きすぎる JAR — 必要な依存関係だけを含めます
- メモリ不足 — Java は Node.js や Python より多くのメモリを必要とします
- タイムアウト処理がない — 常に適切なタイムアウトを設定します
リファレンス
各トピックの詳細なガイダンスについては、以下を参照してください。
- Micronaut Lambda — Micronaut の完全なセットアップ、AOT 設定、DI の最適化
- Raw Java Lambda — 最小限のハンドラーパターン、シングルトンキャッシュ、JAR のパッケージ化
- Serverless Deployment — Serverless Framework、SAM、CI/CD パイプライン、プロビジョンドコンカレンシー
- Testing Lambda — JUnit 5、SAM Local、統合テスト、パフォーマンス測定
例
例 1:Micronaut Lambda 関数を作成する
入力:
Create a Java Lambda function using Micronaut to handle user REST API
処理:
- Micronaut プラグインを使って Gradle プロジェクトを設定します
- MicronautRequestHandler を継承する Handler クラスを作成します
- GET/POST/PUT/DELETE 用のメソッドを実装します
- AOT 最適化を含む application.yml を設定します
- Shadow プラグインを使ったパッケージ化を設定します
- 確認:デプロイ前に SAM CLI でローカルテストを実施します
出力:
- 完全なプロジェクト構成
- 依存性注入を備えたハンドラー
- serverless.yml のデプロイ設定
例 2:素の Java のコールドスタートを最適化する
入力:
My Java Lambda has 3 second cold start, how do I optimize it?
処理:
- 初期化コードを分析します
- AWS クライアントの作成を静的フィールドに移します
- build.gradle の依存関係を減らします
- 最適化された JVM オプションを設定します
- プロビジョニング済み同時実行を検討します
- 検証:変更後に CloudWatch メトリクスを使ってコールドスタートを測定します
出力:
- シングルトンパターンを使用してリファクタリングされたコード
- 最小化された JAR
- コールドスタート < 500ms
例 3:GitHub Actions でデプロイする
入力:
Configure CI/CD for Java Lambda with SAM
処理:
- GitHub Actions ワークフローを作成します
- Shadow を使った Gradle ビルドを設定します
- SAM のビルドとデプロイを設定します
- デプロイ前にテストステージを追加します
- prod の環境保護を設定します
出力:
- 完全な .github/workflows/deploy.yml
- マルチステージパイプライン(dev/staging/prod)
- 統合されたテスト自動化
バージョン
バージョン:1.0.0
コメント
Markdown 対応