DB 作成時に **「マスターパスワードを Secrets Manager で管理」**を選んだときに RDS が自動作成した “Master user secret”

AWS

1) その rds!cluster-... シークレットの中身は何?

通常、RDS が作った secret の SecretStringJSONで、だいたいこういうキーを持ちます:

  • username
  • password
  • host
  • port
  • dbname(ない場合もあります)

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:GetSecretValue
  • secretsmanager: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:AWSCURRENT
  • DB_USER の Value: rds!cluster-9******:username:AWSCURRENT

✅ ポイント:AWSCURRENT の後ろに :何か を付けない(付けると VersionId 扱いになりがち)

1) まず前提:IAMロールに付けるのは「権限」

ロール作成(または既存ロール)に付けるのは、こういう許可です:

  • secretsmanager:GetSecretValue
  • secretsmanager: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_NAMEPLAINTEXTで手入力(例:appdb)の方が早いです。

コメント