条件付きでCloudFormationリソースのプロパティを指定

2021.01.20

CloudFormationは事前に指定したテンプレートから容易にインフラを構築できるツールです。エンジニアはよく自分で諸々なパラメータを指定したいのでCloudFormationでそれもできます。

簡単なプロパティ

条件付きでリソースのプロパティを指定できます。例えば環境によって違うEC2インスタンスタイプを構築します。以下の場合はスタックのEnvironmentパラメータを "prod" に設定したらインスタンスタイプはt2.largeになり、それ以外にはt2.microになります。

Parameters:
  Environment:
    Type: String

Conditions:
  IsProd: !Equals [Environment, "prod"]

Resources:
  MyEc2:
    Type: AWS::EC2::Instance
    Properties: 
      InstanceType: !If [ IsProd, t2.large, t2.micro ]

If関数のシンタックスは以下です。条件、条件の結果はtrueの場合値, 条件の結果はfalseの場合値

Fn::If: [condition_name, value_if_true, value_if_false]

Mappingプロパティ

上記は簡単なプロパティです。リソースはMappingプロパティもあります、例えばEC2インスタンスはCpuOptionというプロパティがあります。上記と同じ!If関数を使いますがもうちょっと読みやすいシンタックスにします。条件はtrueの場合は、yamlのMappingを設定します。falseの場合はAWS::NoValueという擬似パラメータになりますのでCpuOptionsプロパティは設定されません。

Parameters:
  Environment:
    Type: String

Conditions:
  IsProd: !Equals [Environment, "prod"]

Resources:
  MyEc2:
    Type: AWS::EC2::Instance
    Properties: 
      InstanceType: !If [ IsProd, t2.large, t2.micro ]
      CpuOptions: !If
        - IsProd
        - CoreCount: 1
          ThreadsPerCore: 2
        - !Ref AWS::NoValue