背景
作成中のCFnのスタックをいくつかのVPC上で実行したいので
vpc-idやその他のパラメータはベタ書きせずに外部から参照するかたちにしました。
CFnでは動的な参照を使用してテンプレート値を指定する機能を利用して
SSMのパラメータストアやSecrets Managerから値を参照することができます。
参照パターン
# '{{resolve:ssm:parameter-name:version}}'
'{{resolve:ssm:vpc-id:1}}'
問題
SSMパラメータストアにパラメータを設定した上で
テンプレート名のパラメータセクションでこのように書きました。
CFnテンプレート
VpcId:
Type: AWS::EC2::VPC::Id
Default: '{{resolve:ssm:vpc-id:1}}'
このテンプレートからスタックを作成するとエラーになります。
イベント内に出力されるエラー
Parameter validation failed: parameter value {{resolve:ssm:vpc-id:1}} for parameter name VpcId does not exist. Rollback requested by user.
存在しない…とはいえCLIからパラメータストアを参照すると普通に見えます。
CLIからパラメータストアを参照
aws ssm get-parameter --name=vpc-id
{
"Parameter": {
"Name": "vpc-id",
"Value": "vpc-a1b2c3d4",
"Version": 1,
"Type": "String"
}
}
解決
テンプレートの Type
を書き換えると参照できました。
CFnテンプレート
VpcId:
Type: String
Default: '{{resolve:ssm:vpc-id:1}}'
AWS 固有のパラメーター型を使えば
入力値の検証やサジェストの面でメリットがありますが
現状はここに動的参照の値を直接置くことはできないようです。
厳密な原因が見つかっていないためまだなんとも言えませんが
does not exist.
に惑わされないようにしましょう。