🔏
ECS(Fargate) でコンテナの環境変数を Secrets Manager から取得できない
まず基本的に確認すべき項目はクラスメソッドさんの記事
ECSでコンテナ環境変数をSecretManagerから取得する際にResourceInitializationErrorが発生したときの対処方法
にあります。
- タスク実行ロールに Secrets Manager を読み込む権限があるか
- 読み込むARN文字列の形式が間違っていないか
- プライベートサブネットで実行する場合 Secrets Manager へのVPCエンドポイントが設定されているか
過日、これらの問題は一度遭遇しており、また似たような(同じではない)環境構築だからと甘く見ていました。
端的に
- CDK で 構築している
- Secrets Manager には 外部のDBへの接続設定を格納したかったので CDKの外
- CDK で RDS のシークレットを作って Fargate に参照させるノリで構築してみた
- だめだった
- タスク定義のJSONを眺めていたら 読み込むARN文字列の形式 が違っている気がした
- あらためて
fromSecretNameV2
について調べてみた
Secret.fromSecretNameV2 という静的メソッドを利用します。少し前まで使えた Secret.fromSecretArn や Secret.fromSecretName は deprecated になっているので注意してください。
尚この利用方法は該当の Secret とスタックが同一アカウント/リージョン内に存在することが前提です。もしそうでない場合は、Secret のフル ARN を指定する必要がありますので Secret.fromSecretAttributes を使います。
引用元: AWS CDK で特定の Secret ID を持つ Secret へのアクセス許可を与える
(太字は筆者による)なんということでしょう、そのような罠が
結論としては、コンソールからARNをコピーしてきて fromSecretCompleteArn
で読み込むようにしたら解決しました
具体的な違いとして、シークレットのARNが
arn:aws:secretsmanager:ap-northeast-1:<account_id>:secret:<secret_name>-<なんかランダムな文字列>
となっていたのですが fromSecretNameV2
に <secret_name>
を指定していた場合、タスク定義のJSONに表れた 読み込むARN文字列の形式 には、「なんかランダムな文字列」が存在しませんでした。
なので、クラスメソッドさんの記事のとおりに確認する、でまず間違いないですが、こういうハマりパターンもあるよ、ということで…。
Discussion