1) その rds!cluster-... シークレットの中身は何?
通常、RDS が作った secret の SecretString は JSONで、だいたいこういうキーを持ちます:
usernamepasswordhostportdbname(ない場合もあります)
2) まずコマンドで “正しいシークレット名/ARN” を確認
シークレット情報(名前・ARN・KMS)確認
aws secretsmanager describe-secret \
--secret-id 'rds!cluster-9******' \
--query "{Name:Name,ARN:ARN,KmsKeyId:KmsKeyId}" \
--output table
中身の JSON を確認(※機密注意)
aws secretsmanager get-secret-value \
--secret-id 'rds!cluster-9******' \
--query SecretString \
--output text
3) CodeBuild のロール権限(これがないと AccessDenied)
CodeBuild の サービスロールに最低これが必要です:
secretsmanager:GetSecretValuesecretsmanager:DescribeSecret
対象をそのシークレット ARN に絞るのが推奨です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ReadRdsMasterSecret",
"Effect": "Allow",
"Action": [
"secretsmanager:GetSecretValue",
"secretsmanager:DescribeSecret"
],
"Resource": "arn:aws:secretsmanager:ap-northeast-1:<ACCOUNT_ID>:secret:rds!cluster-9*******"
}
]
}
4) どうしても CodeBuild の「Type: Secrets Manager」を使いたい場合
この形式を 末尾まで正しく書く必要があります(間違えるとあなたのように VersionId エラーになります)。
DB_PASSWORDの Value: rds!cluster-9******:password:AWSCURRENTDB_USERの Value: rds!cluster-9******:username:AWSCURRENT
✅ ポイント:AWSCURRENT の後ろに :何か を付けない(付けると VersionId 扱いになりがち)
1) まず前提:IAMロールに付けるのは「権限」
ロール作成(または既存ロール)に付けるのは、こういう許可です:
secretsmanager:GetSecretValuesecretsmanager:DescribeSecret
(必要ならkms:Decrypt)
👉 ロール側に「DB_Name/DB_Password」みたいな変数名は作りません。
それは CodeBuild の環境変数でやります。
2) CodeBuild 環境変数(Type=SECRETS_MANAGER)の正しい入れ方
あなたが設定したいのは、環境変数で DBユーザー名とパスワードを注入することなので、こうなります。
✅ 例:rds!cluster-9****** のシークレットから取る
環境変数1
- 名前(Name):
DB_USERNAME - タイプ(Type):
SECRETS_MANAGER - 値(Value):
rds!cluster-9******:username:AWSCURRENT
環境変数2
- 名前(Name):
DB_PASSWORD - タイプ(Type):
SECRETS_MANAGER - 値(Value):
rds!cluster-9******:password:AWSCURRENT
✅ これが「合っている形」です。
3) あなたの書き方でどこが違う?
名前:DB_Name/DB_Password
値:DB_USERNAME/DB_PASSWORD
ここが逆です。
- 名前(Name) = ビルド内で参照する変数名(
DB_USERNAME/DB_PASSWORDなど) - 値(Value) = Secrets Manager 参照式(
rds!cluster…:password:AWSCURRENTなど)
4) DB_NAME も必要なら
dbname キーがシークレットに入っていれば同じようにできます(入ってないことも多いです)。
- 名前:
DB_NAME - タイプ:
SECRETS_MANAGER - 値:
rds!cluster-9******:dbname:AWSCURRENT
※ dbname が無い場合は、DB_NAME は PLAINTEXTで手入力(例:appdb)の方が早いです。
コメント