🦁

【AWS Secrets Manager】末尾が "ハイフン+6文字" のシークレット名には気をつけろ!!

に公開

背景

AWS Secrets Managerにおいて、シークレットの命名に関する少し特殊な「罠」に引っかかってしまったため、備忘録として残しておきます。
同じような挙動で数時間を無駄にする方が一人でも減れば幸いです。

忙しい人向けの結論

  • シークレット名の末尾を -secret などの「ハイフン+6文字」にした場合、IaC(AWS CDKなど)でシークレット名(部分ARN)を指定して参照しようとすると、リソースを見つけられずエラーになる可能性がある。
  • 原因: Secrets Managerが、シークレット名の一部を「AWSが自動付与するランダムなサフィックス」だと誤認してしまうため。
  • 対策: 常にサフィックスまで含んだ「全ARN」で指定するか、末尾がハイフン+6文字にならないよう命名を変更する。

問題が発生する具体的なケース

例えば、AWS Secrets Managerで app/cookie-secret というシークレットを作成したとします。

このシークレットをAWS CDK(TypeScript)からシークレット名(部分ARN)を使って参照しようとして、以下のようなコードを書きました。

// シークレット名(部分ARN)で参照を試みる
const cookieSecret = secretsmanager.Secret.fromSecretNameV2(
  this,
  "CookieSecret",
  "app/cookie-secret" // 取得したいシークレット名
);

一見何も間違っていないように見えますが、このコードを実行すると「シークレットが見つからない」という旨のエラーが発生してしまいます。

また、エラーログだけを見ても「命名規則が原因であること」は判別できず、AIも原因特定してくれませんでした。

実際に発生するエラーメッセージ

ResourceInitializationError: unable to pull secrets or registry auth: execution resource retrieval failed: unable to retrieve secret from asm: service call has been retried 1 time(s): failed to fetch secret [arn] from secrets manager: operation error Secrets Manager: GetSecretValue, https response error StatusCode: 400, RequestID: [RequestID], ResourceNotFoundException: Secrets Manager can't find the specified secret.

そのため、通常は「IAMロールの権限不足(GetSecretValue)」「タイポ(打ち間違い)」「参照リージョンの間違い」などを疑ってしまい、原因特定までに多くの時間を浪費することになります。

実は、このエラーの原因は -secret という末尾の文字列(ハイフン+6文字) にあります。


なぜ起きるのか?

原因を理解するために、Secrets Managerの「部分ARN」と「全ARN」の違いを押さえておく必要があります。

  • 部分ARN(またはシークレット名):
    ユーザーが定義したシークレットの名前そのものです。(例:app/cookie-secret
  • 全ARN(Complete ARN):
    シークレットを作成した際、AWS側が重複防止などのために末尾に自動生成して付与する「ハイフン+ランダムな6文字のサフィックス」までを含んだ完全なARNです。
    (例:arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:app/cookie-secret-RndStr

通常、Secrets Managerは部分ARN(シークレット名)を受け取ると、内部的に全ARNを検索してリソースを特定してくれます。

しかし、シークレット名が app/cookie-secret のように「ハイフン+6文字」で終わっていると、Secrets Managerは「これは app/cookie というシークレット名に、-secret というサフィックスがついた全ARNの一部だな」と誤認してしまいます。

その結果、存在もしない app/cookie というシークレットを探しに行ってしまい、「リソースが見つかりません」とエラーを出していたのです。

この挙動は、公式ドキュメントのトラブルシューティングにもしっかり記載されています。
https://docs.aws.amazon.com/secretsmanager/latest/userguide/troubleshoot.html#ARN_secretnamehyphen


回避策・解決策

この罠を回避する方法は主に2つあると考えています。

対策1:全ARN(secretCompleteArn)で指定する

AWSの公式ドキュメントでも推奨されている最もシンプルな方法です。自動生成されたサフィックスまでを含む「全ARN」を明示的に指定すれば、AWS側が誤認することはなくなります。

AWS CDKであれば、fromSecretCompleteArn メソッドを使用して完全なARNを渡してあげます。

// 全ARN(サフィックス付きの完全なARN)を指定して参照する
const cookieSecret = secretsmanager.Secret.fromSecretCompleteArn(
  this,
  "CookieSecret",
  "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:app/cookie-secret-RndStr"
);

対策2:命名規則で「ハイフン+6文字」を避ける

「環境毎にARNを動的に切り替えたいから、できればシークレット名でスマートに引き回したい!」という場合は、最初から命名で回避するのが確実かと思います。

特に -secret-config-deploy などの6文字の英単語は、ハイフンと組み合わせるとちょうど6文字になってしまうため、もっとも踏み抜きやすい地雷です。

  • app/cookie-secret-value(末尾を別の文字列にする)
  • app/cookie_secret(ハイフンではなくアンダースコアにする)

このように、末尾のパターンを少し変えるだけで、シークレット名(部分ARN)のままでも正常に参照できるようになります。
また、命名ルール(LinterやCIでのチェック)を設けるのも対策になるかと思います。


まとめ

AWS Secrets Managerのサフィックス誤認問題についてご紹介しました。

-secret という名前は、シークレットの用途を表す上でついつい付けたくなる名前なので、同様のエラーに遭遇した際はぜひ「末尾の文字数」を疑ってみてください!

レバテック開発部

Discussion