自主的20%るぅる

各々が自主的に好き勝手書くゆるふわ会社ブログ

CFn

CloudFormationの条件関数について

今回は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にかかわる部分について抜粋した図が以下となります。
condition
基本的な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

condition

condition

まとめ


今回はCloudFormationのConditionsと!Equals, !Andについて解説しました。

色々な記事を読んで最初使い方が全くわからなかったので、それをもう少しわかりやすくかみ砕いた内容にしたいと思い、自分への備忘も込めてアウトプットしました。

Let’s share this article!

{ 関連記事 }

{ この記事を書いた人 }

アバター画像
Yuki_Izumi

32歳から医療業界からエンジニアに転職しました。

野球、バスケ、将棋、絵を描くこと、などなど
色々多趣味ですが、結婚してエンジニアになってからは
すべて疎遠になりました。

生活に余裕ができたらすこーしずつ趣味も実践していきたいと
思っている未熟エンジニアです。

記事一覧