CloudFormationにあるパラメータのDefaultは最初の1回しか使われないため、値の変更時は注意しよう

CloudFormationのパラメータにはDefaultが設定できますが、最初の1回のみが参照されます。 そのため、2回目以降にパラメータの値を変更したい場合は、Defaultの値を変更してもダメです。
2020.08.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

CloudFormationのパラメータって便利ですよね。環境名を定義したり、DynamoDBテーブル名を定義したりです。 そんなパラメータに設定できるDefaultですが、これは最初の1回しか参照されません。 そのため、値を変更する場合はDefaultの値を変更してもダメです。

やってみる

次のCloudFormationテンプレートがあるとします。SNSトピックを1つ作成しており、トピック名に環境名のdevを付与しています。

sample.yaml

AWSTemplateFormatVersion: "2010-09-09"
Description: Sample Stack

Parameters:
  Env:
    Type: String
    Default: dev

Resources:
  FooBarSNSTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: !Sub foo-bar-sns-topic-${Env}

1. まずは普通にデプロイする

実際にデプロイしてみます。

aws cloudformation deploy \
    --template-file sample.yaml \
    --stack-name foo-bar-sample-stack \
    --no-fail-on-empty-changeset

CloudFormationのパラメータはDefaultdevが反映されています。

CloudFormationのパラメータの様子

SNSトピックもバッチリと作成されています。

SNSトピックの様子

2. Defaultの値を変更してデプロイする

開発環境の名前(dev)をコードネームのorangeに変更することになったとします。 それに伴って、CloudFormationのパラメータのDefaultの値を変更します。

sample.yaml

AWSTemplateFormatVersion: "2010-09-09"
Description: Sample Stack

Parameters:
  Env:
    Type: String
    Default: orange

Resources:
  FooBarSNSTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: !Sub foo-bar-sns-topic-${Env}

この状態でデプロイします。

aws cloudformation deploy \
    --template-file sample.yaml \
    --stack-name foo-bar-sample-stack \
    --no-fail-on-empty-changeset

コマンド実行すると、「変更するものが無いからデプロイしないよ」と言われました。

Waiting for changeset to be created..

No changes to deploy. Stack foo-bar-sample-stack is up to date

3. パラメータを上書きしてデプロイする

Defaultが反映されないことを確認するために、CloudFormationテンプレートのパラメータにある環境名をdevに戻します。

sample.yaml

AWSTemplateFormatVersion: "2010-09-09"
Description: Sample Stack

Parameters:
  Env:
    Type: String
    Default: dev

Resources:
  FooBarSNSTopic:
    Type: AWS::SNS::Topic
    Properties:
      TopicName: !Sub foo-bar-sns-topic-${Env}

このファイルをデプロイします。このとき、新しい環境名のorangeをコマンド実行時に指定します。

aws cloudformation deploy \
    --template-file sample.yaml \
    --stack-name foo-bar-sample-stack \
    --no-fail-on-empty-changeset \
    --parameter-overrides Env=orange

今度は成功しました。

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - foo-bar-sample-stack

CloudFormationを確認すると、バッチリと変更されています。

CloudFormationのパラメータの様子

SNSトピック名も変更されています。

SNSトピックの様子

さいごに

CloudFormationのパラメータの値をあとから変更する事は少ないかもしれませんが、Defaultを使っている場合は注意が必要です。

そもそも、Defaultは「1回目にパラメータが未指定なら使う値」という動作です。 「パラメータが未指定ならダメ」を望むなら、Defaultは使わない方が良いですね。

参考