【小ネタ】AWSCLIでcreate-stackを実行する際にリスト形式が渡せない時の対処

こんばんわ、吉江です。

CloudFormationを使用する時に皆さんはAWSCLIを使用しますか?
入力パラメーターが少ないテンプレートや固有パラメーターを使用するときはマネジメントコンソールで事足りますが、 複数のパラメーターで手入力を行う時はなかなかつらいものがあります。

私が使用しているテンプレートではDBサブネットグループの作成を含めておりまして、 2つ以上のサブネットIDを指定する時にCommaDelimitedListを使用して、subnet-xxxxxx,subnet-yyyyyyで 指定しておりました。

今回はこういうコマンドを実行してました。

% aws cloudformation create-stack --stack-name TEST-DBServer ¥
--template-body file://wip_rds.yaml ¥
--parameters ParameterKey=DBBackupRetentionPeriod,ParameterValue=7 ¥
ParameterKey=DBBackupWindow,ParameterValue=xx:00-yy:00 ¥
ParameterKey=DBInstanceClass,ParameterValue=db.t2.small ¥
ParameterKey=DBMaintenanceWindow,ParameterValue=sun:xx:00-sun:yy:00 ¥
ParameterKey=DBMasterPassword,ParameterValue=absnomypassword ¥
ParameterKey=DBMasterUser,ParameterValue=yoshie ¥
ParameterKey=DBSecurityGroupId,ParameterValue=sg-xxxxxxxxx ¥
ParameterKey=DBSubnetsInVPC,ParameterValue='subnet-xxxxxxxxxxxxx,subnet-yyyyyyyyyyyyy'

このコマンドを実行したとき、以下のメッセージが帰ってきます。

Parameter validation failed:
Invalid type for parameter Parameters[7].ParameterValue, value: ['subnet-xxxxxxxxxxxxx', 'subnet-yyyyyyyyyyyyy'], type: <class 'list'>, valid types: <class 'str'>

適切な形でsubnetidが指定されてないメッセージでした。

その後の試行錯誤は端折って結果を書くと以下のような形で実行すると通ります。

% aws cloudformation create-stack --stack-name TEST-DBServer ¥
--template-body file://wip_rds.yaml ¥
--parameters ParameterKey=DBBackupRetentionPeriod,ParameterValue=7 ¥
ParameterKey=DBBackupWindow,ParameterValue=xx:00-yy:00 ¥
ParameterKey=DBInstanceClass,ParameterValue=db.t2.small ¥
ParameterKey=DBMaintenanceWindow,ParameterValue=sun:xx:00-sun:yy:00 ¥
ParameterKey=DBMasterPassword,ParameterValue=absnomypassword ¥
ParameterKey=DBMasterUser,ParameterValue=yoshie ¥
ParameterKey=DBSecurityGroupId,ParameterValue=sg-xxxxxxxxx ¥
ParameterKey=DBSubnetsInVPC,ParameterValue='subnet-xxxxxxxxxxxxx¥,subnet-yyyyyyyyyyyyy'

分かりづらいですが、最後のDBSubnetsInVPCで指定しているパラメーター値のカンマをエスケープすることで通ります。

ParameterKey=DBSubnetsInVPC,ParameterValue='subnet-xxxxxxxxxxxxx¥,subnet-yyyyyyyyyyyyy'

答えはここに書いてます。
エラーのトラブルシューティング リストを渡す際のパラメーター解析エラー参照

最後に

各サービスのドキュメントはちゃんと読みましょう。