mcpField
A
aws-sdk-java-v2-lambda

aws-sdk-java-v2-lambda

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

aws-sdk-java-v2-lambda について

AWS SDK for Java 2.x を使う Java 開発者向けに、AWS Lambda 関数の呼び出しと管理のパターンを提供します。Spring Boot 連携とテスト方法も含みます。

主な機能

  1. 01同期・非同期の関数呼び出し
  2. 02関数の作成、更新、削除
  3. 03関数設定とレイヤーの管理
  4. 04Spring Boot 連携パターン
  5. 05モックまたは LocalStack によるテスト

活用シーン

  1. 01Java アプリからの Lambda 呼び出し
  2. 02関数コードのデプロイや更新
  3. 03タイムアウト、メモリ、環境変数の変更
  4. 04Spring Boot サービスでの呼び出しラップ

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/giuseppe-trisciuoglio/developer-kit --skill aws-sdk-java-v2-lambda

インストール後、Claude Code で/aws-sdk-java-v2-lambdaを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
client-setup.md
examples.md
function-management.md
invocation-patterns.md
official-documentation.md
spring-boot-integration.md
testing.md

詳細

AWS SDK for Java 2.x - AWS Lambda

概要

AWS Lambda は、サーバーを管理することなくコードを実行できるコンピューティングサービスです。このスキルを使用して、アプリケーションやサービスで AWS SDK for Java 2.x を使った AWS Lambda の操作を実装します。

使用する場面

  • Java アプリケーションから Lambda 関数を呼び出す場合
  • SDK を使用して Lambda 関数をデプロイ、更新する場合
  • 関数の設定やレイヤーを管理する場合
  • Lambda を Spring Boot アプリケーションと統合する場合

クイックリファレンス

操作SDK メソッドユースケース
呼び出しinvoke()関数の同期/非同期呼び出し
関数一覧の取得listFunctions()すべての Lambda 関数を取得
設定の取得getFunction()関数の設定を取得
関数の作成createFunction()新しい Lambda 関数を作成
コードの更新updateFunctionCode()新しい関数コードをデプロイ
設定の更新updateFunctionConfiguration()設定(タイムアウト、メモリ、環境変数)を変更
関数の削除deleteFunction()Lambda 関数を削除

手順

1. 依存関係を追加する

Lambda SDK の依存関係を pom.xml に含めます。

<dependency>
    <groupId>software.amazon.awssdk</groupId>
    <artifactId>lambda</artifactId>
</dependency>

完全なセットアップについては、client-setup.md を参照してください。

2. クライアントを作成する

適切な設定で LambdaClient をインスタンス化します。

LambdaClient lambdaClient = LambdaClient.builder()
    .region(Region.US_EAST_1)
    .build();

非同期操作には LambdaAsyncClient を使用します。

3. Lambda 関数を呼び出す

同期呼び出し:

InvokeRequest request = InvokeRequest.builder()
    .functionName("my-function")
    .payload(SdkBytes.fromUtf8String(payload))
    .build();

InvokeResponse response = lambdaClient.invoke(request);

return response.payload().asUtf8String();

呼び出しパターンについては、invocation-patterns.md を参照してください。

4. レスポンスを処理する

レスポンスのペイロードを解析し、エラーを確認します。

if (response.functionError() != null) {
    throw new LambdaInvocationException("Lambda error: " + response.functionError());
}

String result = response.payload().asUtf8String();
5. 関数を管理する

Lambda 関数を作成、更新、または削除します。

// Create
CreateFunctionRequest createRequest = CreateFunctionRequest.builder()
    .functionName("my-function")
    .runtime(Runtime.JAVA17)
    .role(roleArn)
    .code(code)
    .build();

lambdaClient.createFunction(createRequest);

// Verify function is active before proceeding
GetFunctionRequest getRequest = GetFunctionRequest.builder()
    .functionName("my-function")
    .build();
GetFunctionResponse getResponse = lambdaClient.getFunction(getRequest);
if (!"Active".equals(getResponse.configuration().state())) {
    throw new IllegalStateException("Function not active: " + getResponse.configuration().stateReason());
}

// Update code
UpdateFunctionCodeRequest updateCodeRequest = UpdateFunctionCodeRequest.builder()
    .functionName("my-function")
    .zipFile(SdkBytes.fromByteArray(zipBytes))
    .build();

lambdaClient.updateFunctionCode(updateCodeRequest);

// Wait for deployment to complete
Waiter<GetFunctionConfigurationRequest> waiter = lambdaClient.waiter();
waiter.waitUntilFunctionUpdatedActive(GetFunctionConfigurationRequest.builder()
    .functionName("my-function")
    .build());

完全なパターンについては、function-management.md を参照してください。

6. 環境を設定する

環境変数と同時実行数の上限を設定します。

Environment env = Environment.builder()
    .variables(Map.of(
        "DB_URL", "jdbc:postgresql://db",
        "LOG_LEVEL", "INFO"
    ))
    .build();

UpdateFunctionConfigurationRequest configRequest = UpdateFunctionConfigurationRequest.builder()
    .functionName("my-function")
    .environment(env)
    .timeout(60)
    .memorySize(512)
    .build();

lambdaClient.updateFunctionConfiguration(configRequest);
7. Spring Boot と統合する

Lambda の Bean とサービスを設定します。

@Configuration
public class LambdaConfiguration {
    @Bean
    public LambdaClient lambdaClient() {
        return LambdaClient.builder()
            .region(Region.US_EAST_1)
            .build();
    }
}

@Service
public class LambdaInvokerService {
    public <T, R> R invoke(String functionName, T request, Class<R> responseType) {
        // Implementation
    }
}

完全な統合については、spring-boot-integration.md を参照してください。

8. ローカルでテストする

開発時のテストには、モックまたは LocalStack を使用します。

テストパターンについては、testing.md を参照してください。

例

基本的な呼び出し
public String invokeFunction(LambdaClient client, String functionName, String payload) {
    InvokeRequest request = InvokeRequest.builder()
        .functionName(functionName)
        .payload(SdkBytes.fromUtf8String(payload))
        .build();

    InvokeResponse response = client.invoke(request);

    if (response.functionError() != null) {
        throw new RuntimeException("Lambda error: " + response.functionError());
    }

    return response.payload().asUtf8String();
}
非同期呼び出し
public void invokeAsync(LambdaClient client, String functionName, Map<String, Object> event) {
    String jsonPayload = new ObjectMapper().writeValueAsString(event);

    InvokeRequest request = InvokeRequest.builder()
        .functionName(functionName)
        .invocationType(InvocationType.EVENT)
        .payload(SdkBytes.fromUtf8String(jsonPayload))
        .build();

    client.invoke(request);
}
Spring Boot サービス
@Service
public class LambdaService {
    private final LambdaClient lambdaClient;

    public UserResponse processUser(UserRequest request) {
        String payload = objectMapper.writeValueAsString(request);

        InvokeResponse response = lambdaClient.invoke(
            InvokeRequest.builder()
                .functionName("user-processor")
                .payload(SdkBytes.fromUtf8String(payload))
                .build()
        );

        return objectMapper.readValue(
            response.payload().asUtf8String(),
            UserResponse.class
        );
    }
}

その他の例については、examples.md を参照してください。

ベストプラクティス

  • クライアントを再利用する:LambdaClient/LambdaAsyncClient は一度だけ作成します。これらはスレッドセーフです。
  • 非同期クライアントを使用する:結果を待たずに呼び出す場合は、CompletableFuture とともに LambdaAsyncClient を使用します。
  • デプロイを確認する:作成/更新操作の後は、関数の状態が Active になるまで必ず待ちます。
  • ペイロードサイズを制限する:リクエスト/レスポンスのペイロードは、非同期呼び出しでは 256KB 未満、同期呼び出しでは 6MB 未満にします。
  • タイムアウトを設定する:クライアントの読み取りタイムアウトは、Lambda 関数のタイムアウトより少し長く設定します。
  • 最新のランタイムを使用する:コールドスタートのパフォーマンスを改善するため、Runtime.JAVA17 以降を指定します。

制約と警告

  • ペイロードの上限:同期呼び出しでは 6MB、非同期呼び出しでは 256KB
  • タイムアウト:呼び出しごとに最大 900 秒(15 分)
  • コールドスタート:JVM ベースの関数はコールドスタートに時間がかかります。改善には GraalVM Native Image を使用します。
  • デプロイサイズ:関数コードとレイヤーの合計は、50MB(圧縮時)または 250MB(展開時)を超えてはなりません。
  • 同時実行数:リージョンごとのデフォルトは 1000 です。容量を確保するには、予約済み同時実行数を使用します。
  • コスト:CloudWatch メトリクスで監視し、予期しないコストの増大を防ぐために請求アラートを設定します。

参考資料

関連スキル

  • aws-sdk-java-v2-core — AWS SDK のコアパターンとクライアント設定
  • spring-boot-dependency-injection — Spring の依存性注入に関するベストプラクティス
  • unit-test-service-layer — Mockito を使用したサービスのテストパターン
  • spring-boot-actuator — 本番環境のモニタリングとヘルスチェック

外部リソース

コメント