今回はCloudFormationの条件関数の使い方についてまとめてみたいと思います。
ここで解説するのはCloudFormationの[Conditionsセクション]と組み込み関数である[
!Equals
]です。この
Conditions
と!Equals
の組み合わせは、Parameters
で指定した値を使ってリソースの作成有無を指定することができます。Parameters
に関する詳細については割愛しています。Conditionsとは
「Conditions = 条件」という意味ですが、ある条件を記述して、その結果が
true
の場合は記述したコードのリソースを作成する、という使い方ができます。構文
Conditions: Conditionsの論理ID:
!Equalsとは
!Equals
とは2つの値が等しいかどうかを比較する関数です。構文
!Equals [ value_1, value_2 ]
valueは任意の型の値です。
この構文は<value_1>の値が<〇〇>であるならば、
true
と判定する、という意味になります。<〇〇>の部分は<value_2>の値を見ています。
つまり、<value_1>の値が<value_2>と等しいなら、
true
と判定し、<value_2>の値が<value_1>と等しくない場合はfalse
となります。使い方
ではこの
Conditions
と!Equals
を組み合わせた使い方について解説します。どういうシチュエーションで使用するかの例ですが、例えば本番環境ではEC2リソースを作成するが、開発環境ではEC2リソースを必要としない場合などに
活用できるかと思います。
実際に例文を示してみましょう。
# パラメータセクションで環境の変数を定義 Parameters: Env: Type: String AllowedValues: - dev # 開発環境 - prd # 本番環境 ec2Prefix: Type: String AllowedValues: - dev-step-server - prd-step-server Default: prd-step-server EC2InstanceAMI: Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2" EC2InstanceType: Type: String AllowedValues: - t2.micro - m7g.xlarge Default: t2.micro
# 条件を定義
Conditions:
IsEnv:
!Equals [ !Ref Env, prd ]
# リソースを定義
Resources:
EC2Instance:
Type: AWS::EC2::Instance
Condition: IsEnv
Properties:
Tags:
- Key: Name
Value: !Sub "${ec2Prefix}"
DisableApiTermination: false
EbsOptimized: false
ImageId: !Ref EC2InstanceAMI
InstanceType: !Ref EC2InstanceType
Parameters, Conditions, Resourcesの3つのセクションをわかりやすくするために分割しています。
そこからConditionsにかかわる部分について抜粋した図が以下となります。
基本的な
Conditions
と!Equals
の使い方は上記の通りです。ただ、条件というからにはAnd条件も一緒に使う必要性が出てきますよね?と思った方、僕も同じことを思いました。
And条件あります!その使い方について次で解説します。
!Andとは
And条件を使用したい場合は!And
という組み込み関数が存在しますので、それを使います。
文字通り、指定されたすべての条件が
true
と評価された場合に〇〇するとい動きになります。And条件を使用した例文を以下に示します。
# パラメータセクションで環境の変数を定義 Parameters: Env: Type: String AllowedValues: - dev # 開発環境 - prd # 本番環境 ec2Prefix: Type: String AllowedValues: - dev-step-server - prd-step-server Default: prd-step-server EC2InstanceAMI: Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id> Default: "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2" EC2InstanceType: Type: String AllowedValues: - t2.micro - m7g.xlarge Default: t2.micro
# 条件を定義
Conditions:
IsEnvAndInstanceType: !And
- !Equals [ !Ref Env, prd ]
- !Equals [ !Ref EC2InstanceType, m7g.xlarge ]
# リソースを定義
Resources:
EC2Instance:
Type: AWS::EC2::Instance
Condition: IsEnvAndInstanceType
Properties:
Tags:
- Key: Name
Value: !Sub "${ec2Prefix}"
DisableApiTermination: false
EbsOptimized: false
ImageId: !Ref EC2InstanceAMI
InstanceType: !Ref EC2InstanceType
まとめ
今回はCloudFormationのConditionsと!Equals, !Andについて解説しました。
色々な記事を読んで最初使い方が全くわからなかったので、それをもう少しわかりやすくかみ砕いた内容にしたいと思い、自分への備忘も込めてアウトプットしました。