条件関数 - AWS CloudFormation

これは新しい AWS CloudFormation テンプレートリファレンスガイドです。ブックマークとリンクを更新してください。CloudFormation の開始方法については、『AWS CloudFormation ユーザーガイド』を参照してください。

条件関数

Fn::IfFn::Equals などの組み込み関数を使用して、条件付きロジックに基づいてスタックリソースを作成および設定できます。これらの条件は、スタックの作成時または更新時に評価されます。必要な条件をすべて定義したら、テンプレートの Resources セクションと Outputs セクションでそれらをリソースまたはリソースプロパティに関連付けることができます。

高度なシナリオでは、Fn::And または Fn::Or 関数を使用して条件を組み合わせたり、Fn::Not を使用して条件の値を否定したりできます。条件をネストして、より複雑な条件付きロジックを作成することもできます。

テンプレートで条件を初めて使用する場合は、まず「AWS CloudFormation ユーザーガイド」の「CloudFormation テンプレートの Conditions 構文」トピックを確認することをお勧めします。

注記

Fn::If 条件を除くすべての条件は、テンプレートの Conditions セクションで定義する必要があります。Fn::If 条件は、Metadata 属性、UpdatePolicy 属性、および Resources セクションと Outputs セクションのプロパティ値で使用できます。

Fn::And

指定されたすべての条件が true に評価された場合は true を返します。条件のいずれかが false に評価された場合は false を返します。Fn::And は AND 演算子として機能します。含めることができる条件の最小数は 2 で、最大数は 10 です。

宣言

JSON

"Fn::And": [{condition}, {...}]

YAML

完全関数名の構文:

Fn::And: [condition]

短縮形の構文:

!And [condition]

パラメータ

condition

true または false に評価される条件です。

Fn::And の使用例

次の MyAndCondition は、参照されるセキュリティグループ名が sg-mysggroup と等しく、SomeOtherCondition が true に評価された場合、true に評価されます。

JSON

"MyAndCondition": { "Fn::And": [ {"Fn::Equals": ["sg-mysggroup", {"Ref": "ASecurityGroup"}]}, {"Condition": "SomeOtherCondition"} ] }

YAML

MyAndCondition: !And - !Equals ["sg-mysggroup", !Ref ASecurityGroup] - !Condition SomeOtherCondition

Fn::Equals

2 つの値が等しいかどうかを比較します。2 つの値が同じ場合は true を返し、同じでない場合は false を返します。

宣言

JSON

"Fn::Equals" : ["value_1", "value_2"]

YAML

完全関数名の構文:

Fn::Equals: [value_1, value_2]

短縮形の構文:

!Equals [value_1, value_2]

パラメータ

value

比較する文字列値です。

Fn::Equals の使用例

次の IsProduction 条件は、EnvironmentType パラメーターの値が prod と等しい場合に true に評価されます。

JSON

"IsProduction" : { "Fn::Equals": [ {"Ref": "EnvironmentType"}, "prod" ] }

YAML

IsProduction: !Equals [!Ref EnvironmentType, prod]

Fn::If

指定された条件が true に評価された場合は 1 つの値を返し、指定された条件が false に評価された場合はもう 1 つの値を返します。現在、CloudFormation では、Metadata 属性、UpdatePolicy 属性、およびテンプレートの Resources セクションと Outputs セクションのプロパティ値で Fn::If 組み込み関数がサポートされています。対応するプロパティを削除するために、戻り値として AWS::NoValue 擬似パラメーターを使用できます。

宣言

YAML

完全関数名の構文:

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

短縮形の構文:

!If [condition_name, value_if_true, value_if_false]

パラメータ

condition_name

Conditions セクションの条件への参照です。参照するには条件の名前を使用します。

value_if_true

指定された条件が true に評価された場合に返される値です。

value_if_false

指定された条件が false に評価された場合に返される値です。

Fn::If の使用例

条件付きでリソースを選択する

次の例では、Amazon EC2 リソース定義の Fn::If 関数を使用して、インスタンスに関連付けるセキュリティグループリソースを決定します。CreateNewSecurityGroup 条件が true に評価された場合、CloudFormation は参照値 NewSecurityGroup (テンプレートの他の場所で作成されたセキュリティグループ) を使用して SecurityGroupIds プロパティを指定します。CreateNewSecurityGroup が false の場合、CloudFormation は参照値 ExistingSecurityGroupId (既存のセキュリティグループを参照するパラメータ) を使用します。

JSON
"Resources": { "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0abcdef1234567890", "InstanceType": "t3.micro", "SecurityGroupIds": { "Fn::If": [ "CreateNewSecurityGroup", [{"Ref": "NewSecurityGroup"}], [{"Ref": "ExistingSecurityGroupId"}] ] }] } } }
YAML
Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-0abcdef1234567890 InstanceType: t3.micro SecurityGroupIds: !If - CreateNewSecurityGroup - [!Ref NewSecurityGroup] - [!Ref ExistingSecurityGroupId]

条件付き出力

テンプレートの Output セクションでは、Fn::If 関数を使用して条件付きで情報を出力できます。次のスニペットでは、CreateNewSecurityGroup 条件が true に評価される場合、CloudFormation は NewSecurityGroup リソースのセキュリティグループ ID を出力します。条件が false の場合は、CloudFormation が ExistingSecurityGroup リソースのセキュリティグループ ID を出力します。

JSON
"Outputs" : { "SecurityGroupId" : { "Description" : "Group ID of the security group used.", "Value" : { "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroupId"} ] } } }
YAML
Outputs: SecurityGroupId: Description: Group ID of the security group used. Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroupId]

条件付き配列値

次の例では、Fn::If を使用して、条件に基づいて異なる配列値を条件付きで指定します。MoreThan2AZs 条件が true に評価された場合、3 つのパブリックサブネットを使用します。それ以外の場合は、2 つのパブリックサブネットのみを使用します。

JSON
"Subnets": { "Fn::If": [ "MoreThan2AZs", [ {"Fn::ImportValue": "PublicSubnet01"}, {"Fn::ImportValue": "PublicSubnet02"}, {"Fn::ImportValue": "PublicSubnet03"} ], [ {"Fn::ImportValue": "PublicSubnet01"}, {"Fn::ImportValue": "PublicSubnet02"} ] ] }
YAML
Subnets: Fn::If: - MoreThan2AZs - - Fn::ImportValue: PublicSubnet01 - Fn::ImportValue: PublicSubnet02 - Fn::ImportValue: PublicSubnet03 - - Fn::ImportValue: PublicSubnet01 - Fn::ImportValue: PublicSubnet02

条件付きプロパティとプロパティ値

次の例では、Fn::If 関数で AWS::NoValue 擬似パラメータを使用します。条件は、スナップショット ID が指定されている場合にのみ、Amazon RDS DB インスタンスのスナップショットを使用します。UseDBSnapshot 条件が true に評価された場合は、CloudFormation は DBSnapshotIdentifier プロパティに DBSnapshotName パラメータ値を使用します。条件が false に評価された場合は、CloudFormation は DBSnapshotIdentifier プロパティを削除します。

また、Amazon RDS DB インスタンスの AllocatedStorage プロパティで Fn::If 関数も使用します。IsProduction 条件が true に評価された場合、ストレージサイズは 100 に設定されます。それ以外の場合、20 に設定されます。

JSON
"MyDatabase" : { "Type" : "AWS::RDS::DBInstance", "Properties": { "DBInstanceClass": "db.t3.micro", "AllocatedStorage": { "Fn::If": [ "IsProduction", 100, 20 ] }, "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : { "Ref" : "DBUser" }, "MasterUserPassword" : { "Ref" : "DBPassword" }, "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" }, "DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] } } }
YAML
MyDatabase: Type: AWS::RDS::DBInstance Properties: DBInstanceClass: db.t3.micro AllocatedStorage: !If [IsProduction, 100, 20] Engine: MySQL EngineVersion: 5.5 MasterUsername: !Ref DBUser MasterUserPassword: !Ref DBPassword DBParameterGroupName: !Ref MyRDSParamGroup DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"]

条件付き更新ポリシー

次のスニペットは、RollingUpdates 条件が true に評価される場合にだけ、自動拡大縮小更新ポリシーを提供します。条件が false に評価される場合は、CloudFormation は AutoScalingRollingUpdate 更新ポリシーを削除します。

JSON
"UpdatePolicy": { "Fn::If": [ "RollingUpdates", { "AutoScalingRollingUpdate": { "MaxBatchSize": 2, "MinInstancesInService": 2, "PauseTime": "PT0M30S" } }, { "Ref": "AWS::NoValue" } ] }
YAML
UpdatePolicy: !If - RollingUpdates - AutoScalingRollingUpdate: MaxBatchSize: 2 MinInstancesInService: 2 PauseTime: PT0M30S - !Ref "AWS::NoValue"

Fn::Not

false と評価された条件に対しては、true を返し、true と評価された条件に対しては、false を返します。Fn::Not は NOT 演算子として機能します。

宣言

JSON

"Fn::Not": [{condition}]

YAML

完全関数名の構文:

Fn::Not: [condition]

短縮形の構文:

!Not [condition]

パラメータ

condition

Fn::Equals または true に評価される、false のような条件です。

Fn::Not の使用例

次の EnvCondition 条件は、EnvironmentType パラメータの値が prod と等しくない場合に true に評価されます。

JSON

"MyNotCondition" : { "Fn::Not" : [{ "Fn::Equals" : [ {"Ref" : "EnvironmentType"}, "prod" ] }] }

YAML

MyNotCondition: !Not [!Equals [!Ref EnvironmentType, prod]]

Fn::Or

指定された条件のいずれかが true に評価された場合は true を返します。条件のすべてが false に評価された場合は false を返します。Fn::Or は OR 演算子として機能します。含めることができる条件の最小数は 2 で、最大数は 10 です。

宣言

JSON

"Fn::Or": [{condition}, {...}]

YAML

完全関数名の構文:

Fn::Or: [condition, ...]

短縮形の構文:

!Or [condition, ...]

パラメータ

condition

true または false に評価される条件です。

Fn::Or の使用例

次の MyOrCondition は、参照されるセキュリティグループ名が sg-mysggroup と等しいか、SomeOtherCondition が true に評価された場合、true に評価されます。

JSON

"MyOrCondition" : { "Fn::Or" : [ {"Fn::Equals" : ["sg-mysggroup", {"Ref" : "ASecurityGroup"}]}, {"Condition" : "SomeOtherCondition"} ] }

YAML

MyOrCondition: !Or [!Equals [sg-mysggroup, !Ref ASecurityGroup], Condition: SomeOtherCondition]

サポートされている関数

Fn::If 条件で次の関数を使用できます。

  • Fn::Base64

  • Fn::FindInMap

  • Fn::GetAtt

  • Fn::GetAZs

  • Fn::If

  • Fn::Join

  • Fn::Select

  • Fn::Sub

  • Ref

Fn::EqualsFn::Or など他のすべての条件で次の関数を使用できます。

  • Fn::FindInMap

  • Ref

  • そのほかの条件関数

サンプルテンプレート

条件付きで、本稼働用、開発用、またはテスト用のスタックのリソースを作成します。

場合によっては、似てはいるものの、微調整したスタックを作成することがあります。たとえば、本稼働用アプリケーションに使用するテンプレートがあるとします。開発またはテスト用に、同じ本稼働用スタックを作成します。ただし、開発やテストでは、本稼働レベルのスタックに含まれている余分な容量のすべては必要としません。代わりに、次の例に示すように環境タイプ入力パラメータを使用して、条件付きで本稼働、開発、およびテストに固有のスタックリソースを作成できます。

prod パラメーターには、devtest、または EnvType を指定できます。環境タイプごとに、テンプレートは異なるインスタンスタイプを指定します。インスタンスタイプは、大きなコンピューティング最適化インスタンスタイプから小さい汎用インスタンスタイプまでさまざまです。条件付きでインスタンスタイプを指定するために、テンプレートは Conditions セクションで 2 つの条件を定義します。1 つは CreateProdResources で、EnvType パラメータ値が prod に等しい場合は true に評価されます。もう 1 つは CreateDevResources で、パラメータ値が dev に等しい場合は true に評価されます。

InstanceType プロパティ内で、テンプレートは 2 つの Fn::If 組み込み関数を使用して、どのインスタンスタイプを使用するかを調べます。CreateProdResources 条件が true の場合、インスタンスタイプは c5.xlarge です。条件が false の場合は、CreateDevResources 条件が評価されます。CreateDevResources 条件が true の場合、インスタンスタイプは t3.medium です。その他の場合、インスタンスタイプは t3.small です。

インスタンスタイプの他に、本稼働環境は Amazon EC2 ボリュームを作成して、インスタンスにアタッチします。MountPoint および NewVolume リソースは、条件が true に評価される場合にだけリソースが作成されるように、CreateProdResources 条件に関連付けられています。

例 JSON
{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters" : { "EnvType" : { "Description" : "Environment type.", "Default" : "test", "Type" : "String", "AllowedValues" : ["prod", "dev", "test"], "ConstraintDescription" : "must specify prod, dev, or test." } }, "Conditions" : { "CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "prod"]}, "CreateDevResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "dev"]} }, "Resources" : { "EC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : "ami-1234567890abcdef0", "InstanceType" : { "Fn::If" : [ "CreateProdResources", "c5.xlarge", {"Fn::If" : [ "CreateDevResources", "t3.medium", "t3.small" ]} ]} } }, "MountPoint" : { "Type" : "AWS::EC2::VolumeAttachment", "Condition" : "CreateProdResources", "Properties" : { "InstanceId" : { "Ref" : "EC2Instance" }, "VolumeId" : { "Ref" : "NewVolume" }, "Device" : "/dev/sdh" } }, "NewVolume" : { "Type" : "AWS::EC2::Volume", "Condition" : "CreateProdResources", "Properties" : { "Size" : "100", "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]} } } } }
例 YAML
AWSTemplateFormatVersion: "2010-09-09" Parameters: EnvType: Description: Environment type. Default: test Type: String AllowedValues: [prod, dev, test] ConstraintDescription: must specify prod, dev, or test. Conditions: CreateProdResources: !Equals [!Ref EnvType, prod] CreateDevResources: !Equals [!Ref EnvType, "dev"] Resources: EC2Instance: Type: AWS::EC2::Instance Properties: ImageId: ami-1234567890abcdef0 InstanceType: !If [CreateProdResources, c5.xlarge, !If [CreateDevResources, t3.medium, t3.small]] MountPoint: Type: AWS::EC2::VolumeAttachment Condition: CreateProdResources Properties: InstanceId: !Ref EC2Instance VolumeId: !Ref NewVolume Device: /dev/sdh NewVolume: Type: AWS::EC2::Volume Condition: CreateProdResources Properties: Size: 100 AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone
注記

条件を使用してリソースを作成するより複雑な例については、「Condition 属性」トピックを参照してください。