背景
ECSのタスクにDBの情報を環境変数として設定しようとした。
その際、情報はSSMのパラメーターストアに保存。
(DBのパスワードはKMSで暗号化し、他は暗号化せずに保存)
しかし、そのパスワードだけ取り込む際にエラー。
インフラのデプロイ方法はCDKで書いて、cdk synth
でcfnテンプレートファイルを出力しcfnのgitsyncでgithubと同期している。
エラー内容
cloudformationのイベントの状況理由に書かれていたエラー内容
Failed to create changeset. Couldn't call cloudformation for stack: app-stack and changeset: cloudformation-auto-sync because of a validation error.
The error was Parameters [/app/POSTGRES_PASSWORD] referenced by template have types not supported by CloudFormation.
(Service: AmazonCloudFormation; Status Code: 400; Error Code: ValidationError; Request ID: ; Proxy: null)
指定した SSM パラメータが CloudFormation テンプレートでサポートされていない型を持っている場合に発生する。
行ったこと
ECSのタスク実行ロールにKMSの権限を付与してみた。
しかしうまく行かない。
↓
次にコードを変えてみた。
secrets: {
POSTGRES_PASSWORD: ecs.Secret.fromSsmParameter(
ssm.StringParameter.fromStringParameterName(
this,
"DBPasssword",
"/itrender/POSTGRES_PASSWORD"
)
),
}
上記のようにはじめは書いていたが、fromStringParameterName
はKMSで暗号化していないものだけらしい。
valueForSecureStringParameter
がKMSで暗号化しているパラメーターを取得できるらしいが現在非推奨。
代わりにSecretValue.ssmSecure()
を使える、と書いてるがどのようにしてもfromSsmParameter
の引数の型とSecretValue.ssmSecure()
の返り値の型が合わない。
↓
記事を発見。
皆もうまく行っていない。
さらにSecretValue.ssmSecure()
は少数のリソースでしかサポートされていないとか、、、
クローズされているが未解決らしい。
回避策
DB情報はsecret managerを使う。
そこからパスワードなりdbnameなりusernameなりを参照するのが吉。
(CDKで書くとタスク実行ロールにsecret managerから取得するロールとかは自動で追加されるので楽〜)