【小ネタ】 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のパラメータグループを作成するときにちょっと困った話でした。
初歩的な内容ではありますが、
ネストスタックなどデプロイに時間のかかるテンプレートでこういったエラーが発生するとかなりの苦痛を伴うため、お気をつけください。
皆さんが同じエラーに遭遇しないことを願っています…。











