mcpField
A
aws-lambda-java-integration

aws-lambda-java-integration

github.com/giuseppe-trisciuoglioクラウド・DevOps3653.5k 回インストール7 週間前に更新
リポジトリ

aws-lambda-java-integration について

JavaでAWS Lambda関数を開発するためのスキルです。Micronautと素のJavaの実装パターンを扱い、コールドスタート最適化、API GatewayまたはALB連携、テスト、デプロイ設定を説明します。

主な機能

  1. 01Micronautと素のJavaの実装パターン
  2. 02コールドスタート最適化の指針
  3. 03API GatewayとALBの連携
  4. 04Serverless FrameworkとAWS SAMの設定
  5. 05テストとCI/CDの例

活用シーン

  1. 01Java AWS Lambda関数の開発
  2. 02実装方式の選択
  3. 03Lambdaのコールドスタート短縮
  4. 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.md
raw-java-lambda.md
serverless-deployment.md
testing-lambda.md

詳細

AWS Lambda Java 統合

コールドスタートを最適化した、高性能な Java AWS Lambda 関数を作成するためのパターンです。

概要

このスキルでは、AWS Lambda Java の開発に関する包括的なパターンを紹介します。主に次の 2 つのアプローチを扱います。

  1. Micronaut Framework — AOT コンパイルと依存性注入に対応した高機能なフレームワークで、コールドスタートは 1 秒未満です
  2. Raw Java — オーバーヘッドを最小限に抑えるアプローチで、コールドスタートは 500 ミリ秒未満です

どちらのアプローチも、本番環境向けの設定で API Gateway と ALB の統合に対応しています。

使用する場面

  • Java 関数を AWS Lambda にデプロイするとき
  • コールドスタートを 1 秒未満に最適化するとき
  • Micronaut と Raw Java のどちらのアプローチを使うか選ぶとき
  • API Gateway または ALB の統合を設定するとき
  • Java Lambda 用の CI/CD パイプラインを構築するとき

手順

1. アプローチを選択する
アプローチコールドスタート適した用途複雑さ
Micronaut1 秒未満複雑なアプリ、DI が必要な場合、エンタープライズ中
Raw Java500 ミリ秒未満シンプルなハンドラー、オーバーヘッドを最小限にしたい場合低

確認:作業を進める前に、選んだアプローチが用途に合っていることを確認します。

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 はコールドスタートのオーバーヘッドを大幅に増加させます
よくある落とし穴
  1. ハンドラー内での初期化 — ウォーム状態の呼び出しでも処理が繰り返されます
  2. サイズの大きすぎる JAR — 必要な依存関係だけを含めます
  3. メモリ不足 — Java は Node.js や Python より多くのメモリを必要とします
  4. タイムアウト処理がない — 常に適切なタイムアウトを設定します

リファレンス

各トピックの詳細なガイダンスについては、以下を参照してください。

  • 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

処理:

  1. Micronaut プラグインを使って Gradle プロジェクトを設定します
  2. MicronautRequestHandler を継承する Handler クラスを作成します
  3. GET/POST/PUT/DELETE 用のメソッドを実装します
  4. AOT 最適化を含む application.yml を設定します
  5. Shadow プラグインを使ったパッケージ化を設定します
  6. 確認:デプロイ前に SAM CLI でローカルテストを実施します

出力:

  • 完全なプロジェクト構成
  • 依存性注入を備えたハンドラー
  • serverless.yml のデプロイ設定
例 2:素の Java のコールドスタートを最適化する

入力:

My Java Lambda has 3 second cold start, how do I optimize it?

処理:

  1. 初期化コードを分析します
  2. AWS クライアントの作成を静的フィールドに移します
  3. build.gradle の依存関係を減らします
  4. 最適化された JVM オプションを設定します
  5. プロビジョニング済み同時実行を検討します
  6. 検証:変更後に CloudWatch メトリクスを使ってコールドスタートを測定します

出力:

  • シングルトンパターンを使用してリファクタリングされたコード
  • 最小化された JAR
  • コールドスタート < 500ms
例 3:GitHub Actions でデプロイする

入力:

Configure CI/CD for Java Lambda with SAM

処理:

  1. GitHub Actions ワークフローを作成します
  2. Shadow を使った Gradle ビルドを設定します
  3. SAM のビルドとデプロイを設定します
  4. デプロイ前にテストステージを追加します
  5. prod の環境保護を設定します

出力:

  • 完全な .github/workflows/deploy.yml
  • マルチステージパイプライン(dev/staging/prod)
  • 統合されたテスト自動化

バージョン

バージョン:1.0.0

コメント