【小ネタ】 CloudFormationでパラメータグループを作成するときYAMLの仕様で困った話

【小ネタ】 CloudFormationでパラメータグループを作成するときYAMLの仕様で困った話

Clock Icon2025.04.24

はじめに

皆様こんにちは、あかいけです。

最近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

https://yaml.org/type/str.html

一方、YAMLは以下の文字を真偽値として扱う仕様があります。

- true / false
- yes  / no
- on   / off
- y    / n
- Y    / N

https://yaml.org/type/bool.html

そのため今回の事象では、パラメータグループ側では文字列の「yes」が必要だったところ、
クォーテーションで囲まなかったことにより、
YAMLの仕様にから「yes」 が 「true」 として扱われエラーが出たということです。

さいごに

以上、
CloudFormationでElastiCacheのパラメータグループを作成するときにちょっと困った話でした。

初歩的な内容ではありますが、
ネストスタックなどデプロイに時間のかかるテンプレートでこういったエラーが発生するとかなりの苦痛を伴うため、お気をつけください。

皆さんが同じエラーに遭遇しないことを願っています…。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.