🔏

ECS(Fargate) でコンテナの環境変数を Secrets Manager から取得できない

2022/02/24に公開

まず基本的に確認すべき項目はクラスメソッドさんの記事

ECSでコンテナ環境変数をSecretManagerから取得する際にResourceInitializationErrorが発生したときの対処方法
https://dev.classmethod.jp/articles/tsnote-ecs-resourceinitializationerror/

にあります。

  • タスク実行ロールに Secrets Manager を読み込む権限があるか
  • 読み込むARN文字列の形式が間違っていないか
  • プライベートサブネットで実行する場合 Secrets Manager へのVPCエンドポイントが設定されているか

過日、これらの問題は一度遭遇しており、また似たような(同じではない)環境構築だからと甘く見ていました。


端的に

  1. CDK で 構築している
  2. Secrets Manager には 外部のDBへの接続設定を格納したかったので CDKの外
  3. CDK で RDS のシークレットを作って Fargate に参照させるノリで構築してみた
  4. だめだった
  5. タスク定義のJSONを眺めていたら 読み込むARN文字列の形式 が違っている気がした
  6. あらためて fromSecretNameV2 について調べてみた

Secret.fromSecretNameV2 という静的メソッドを利用します。少し前まで使えた Secret.fromSecretArn や Secret.fromSecretName は deprecated になっているので注意してください。

尚この利用方法は該当の Secret とスタックが同一アカウント/リージョン内に存在することが前提です。もしそうでない場合は、Secret のフル ARN を指定する必要がありますので Secret.fromSecretAttributes を使います。

引用元: AWS CDK で特定の Secret ID を持つ Secret へのアクセス許可を与える
https://tblog.acomagu.me/6p2/
(太字は筆者による)

なんということでしょう、そのような罠が

結論としては、コンソールからARNをコピーしてきて fromSecretCompleteArn で読み込むようにしたら解決しました

具体的な違いとして、シークレットのARNが

arn:aws:secretsmanager:ap-northeast-1:<account_id>:secret:<secret_name>-<なんかランダムな文字列>

となっていたのですが fromSecretNameV2<secret_name> を指定していた場合、タスク定義のJSONに表れた 読み込むARN文字列の形式 には、「なんかランダムな文字列」が存在しませんでした。

なので、クラスメソッドさんの記事のとおりに確認する、でまず間違いないですが、こういうハマりパターンもあるよ、ということで…。

Discussion