CloudFormationでCommaDelimitedList型の変数を条件文で使うとき(yaml)


経緯

  • CloudFormationでcreate-stack実行時に、引数として変数ENVを取得し、環境毎に変数EC2SGID<ENV>を使い分ける
  • 値が複数&同一のテンプレート環境で管理されてないので、CommaDelimitedList型を使用することになった
  • 条件分岐でCommaDelimitedList型の変数を使うとき、配列の書き方に迷った
  • どう書けば条件文でCommaDelimitedList型の変数を使えるか?

失敗例

Parameters:
  ENV:
    Type: String
    AllowedValues:
      - dev
      - stg
      - prd
  EC2SGIDDev:
    Type: CommaDelimitedList
    Default: sg-hoge, sg-fuga
  EC2SGIDStg:
    Type: CommaDelimitedList
    Default: sg-foo, sg-bar
  EC2SGIDPrd:
    Type: CommaDelimitedList
    Default: sg-piyo, sg-baz
Resources:
	HogeLaunchTemplate:
	    Type: AWS::EC2::LaunchTemplate
	    Properties:
	      LaunchTemplateData:
		# 省略
		# この書き方だとエラーになる
		SecurityGroupIds: !If [IsDev, !Ref EC2SGIDDev, !If IsStg, !Ref EC2SGIDStg, !Ref EC2SGIDPrd]

結果

  • 配列を入れ子状態にして書くことで使用できた

前提

  • Templateはyaml形式を使用

内容

AWSTemplateFormatVersion: '2010-09-09'
Description: hoge
Parameters:
  ENV:
    Type: String
    AllowedValues:
      - dev
      - stg
      - prd
  EC2SGIDDev:
    Type: CommaDelimitedList
    Default: sg-hoge, sg-fuga
  EC2SGIDStg:
    Type: CommaDelimitedList
    Default: sg-foo, sg-bar
  EC2SGIDPrd:
    Type: CommaDelimitedList
    Default: sg-piyo, sg-baz
Conditions:
  IsDev: !Equals [!Ref ENV, dev]
  IsStg: !Equals [!Ref ENV, stg]
  IsPrd: !Equals [!Ref ENV, prd]
Resources:
	HogeLaunchTemplate:
	    Type: AWS::EC2::LaunchTemplate
	    Properties:
	      LaunchTemplateData:
		# 省略
		# 入れ子で構文エラーを回避
		SecurityGroupIds: !If [IsDev, !Ref EC2SGIDDev, !If [IsStg, !Ref EC2SGIDStg, !Ref EC2SGIDPrd]]