1. はじめに
AWS LambdaでDB接続情報やAPIキーを扱う際、環境変数に直接書き込むのはセキュリティ上好ましくありません。今回は AWS Secrets Manager を利用して、Javaコード内から安全に機密情報を取得・利用する仕組みを構築した実績をまとめます。
2. 構成図
3. 実装コード (AWS SDK v2)
Javaプロジェクトの pom.xml に secretsmanager の依存関係を追加した上で、以下のハンドラーを実装します。
SecretsManagerの取得ロジック
public class SecretHandler implements RequestHandler<Map<String,Object>, String> {
private final SecretsManagerClient secretsClient = SecretsManagerClient.builder()
.region(Region.AP_NORTHEAST_1)
.build();
public String handleRequest(Map<String,Object> event, Context context) {
String secretName = "my-app-secrets";
try {
GetSecretValueRequest valueRequest = GetSecretValueRequest.builder()
.secretId(secretName)
.build();
GetSecretValueResponse valueResponse = secretsClient.getSecretValue(valueRequest);
String secret = valueResponse.secretString();
// JSONをパースして利用
context.getLogger().log("Secret successfully retrieved.");
return "SUCCESS";
} catch (Exception e) {
context.getLogger().log("Error: " + e.getMessage());
return "FAILURE";
}
}
}
4. 運用のポイント
キャッシュの導入: 毎回Secrets Managerを叩くとAPI料金がかさみ、レスポンスも遅延します。今回は静的変数や専用ライブラリを使用して、実行環境内で値をキャッシュするように工夫しました。
IAMポリシーのハマりどころ: secretsmanager:GetSecretValue だけでなく、KMSで暗号化している場合は kms:Decrypt の権限も必要になる点に注意が必要です。
5. まとめ
JavaとSecrets Managerの組み合わせは、堅牢なバックエンド構築において必須のスキルだと感じました。型定義がしっかりしているJavaだからこそ、設定値のパースも安全に行えます。
