1. はじめに
業務で「大量のリクエストを低遅延かつ低コストで処理するAPI」が必要になり、API Gateway + Lambda (Java) + DynamoDB のフルサーバーレス構成を構築しました。 Java 17とAWS SDK v2を組み合わせ、パフォーマンスと開発効率を両立させた実装ポイントを共有します。
2. システム構成
3. 実装のハイライト (Java + SDK v2)
JavaでDynamoDBを扱う場合、DynamoDbEnhancedClient を使うと、POJOクラス(Bean)をそのままテーブルにマッピングできるため、コードが非常にスッキリします。
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>dynamodb-enhanced</artifactId>
<version>2.20.0</version>
</dependency>
@DynamoDbBean
public class UserRecord {
private String userId;
private String name;
@DynamoDbPartitionKey
public String getUserId() { return userId; }
public void setUserId(String userId) { this.userId = userId; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
4. 運用のポイントとハマった点
① コールドスタート対策
Java Lambdaにおいて最大の課題は起動速度です。
対策: Lambdaの「SnapStart」を有効化しました。これにより、初期化済みのSnapshotから起動するため、コールドスタートが秒単位からミリ秒単位へと劇的に改善しました。
② DB接続のオーバーヘッド
ハンドラーメソッドの中で毎回 DynamoDbClient を生成すると非常に遅くなります。
対策: クライアント生成は ハンドラー外(静的変数) で行い、実行環境が使い回される際に再利用しました。
5. まとめ
サーバーレスAPIは、初期コストゼロで始められ、スケールも自動という Java 開発者にとっても非常に魅力的な選択肢です。特にSnapStartの登場により、Javaの弱点だった起動速度も克服されつつあります。
