【小ネタ】 CloudFormationでパラメータグループを作成するときYAMLの仕様で困った話
はじめに
皆様こんにちは、あかいけです。
最近CloudFormationでパラメータグループを作成するとき、
YAMLの仕様で困ったことがありました。
かなり初歩的なミスですが、同じ事象に陥った方への手助けになれば幸いです。
結論
今回私が得た教訓は以下の通りです、
なぜこの結論に至ったのかお話しします。
- YAMLの文字列型は必ずクォーテーションで囲もう
- パラメータグループの設定値の値の型を確認しよう
- YAMLの仕様を把握しよう
困ったこと
以下の内容でCloudFormationでElastiCacheのパラメータグループを作成しようとすると、
Resources:
ElastiCacheParameterGroup:
Type: AWS::ElastiCache::ParameterGroup
Properties:
CacheParameterGroupFamily: valkey8
Properties:
activedefrag: yes
以下のエラーでリソースの作成が失敗します。
yes or no が値として設定できるはずなのに、どうしてエラーが出るのでしょうか??
Resource handler returned message:
"invalid parameter value, allowed values are:yes,no (Service: ElastiCache, Status Code: 400, Request ID: 96f3e061-b59e-4dee-9997-11caf18c8b8a)"
原因と解消方法
このエラーの解消方法は超簡単で、
「yes」をクォーテーションで囲むことです。
Resources:
ElastiCacheParameterGroup:
Type: AWS::ElastiCache::ParameterGroup
Properties:
CacheParameterGroupFamily: valkey8
Properties:
activedefrag: "yes"
なぜこうなるのかは、YAMLの仕様が関係します。
まず該当のパラメータグループの設定値の値は文字列型で yes or no を指定する必要があります。
% aws elasticache describe-cache-parameters \
--cache-parameter-group-name default.valkey8 \
--query "Parameters[?ParameterName=='activedefrag']"
[
{
"ParameterName": "activedefrag",
"ParameterValue": "no",
"Description": "Enabled active memory defragmentation",
"Source": "system",
"DataType": "string",
"AllowedValues": "yes,no",
"IsModifiable": true,
"MinimumEngineVersion": "8.0.0",
"ChangeType": "immediate"
}
]
次にYAMLでは以下のように、
文字をクォーテーションで囲んでも囲まなくても、文字列型として扱われます。
そのため今回のエラーとなった記述でも、一見問題ないように感じます。
- "string"
- 'string'
- string
一方、YAMLは以下の文字を真偽値として扱う仕様があります。
- true / false
- yes / no
- on / off
- y / n
- Y / N
そのため今回の事象では、パラメータグループ側では文字列の「yes」が必要だったところ、
クォーテーションで囲まなかったことにより、
YAMLの仕様にから「yes」 が 「true」 として扱われエラーが出たということです。
さいごに
以上、
CloudFormationでElastiCacheのパラメータグループを作成するときにちょっと困った話でした。
初歩的な内容ではありますが、
ネストスタックなどデプロイに時間のかかるテンプレートでこういったエラーが発生するとかなりの苦痛を伴うため、お気をつけください。
皆さんが同じエラーに遭遇しないことを願っています…。