AWS CloudFormation
ユーザーガイド (API バージョン 2010-05-15)

条件関数

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

Fn::If 条件を除くすべての条件は、テンプレートの Conditions セクションで定義します。Fn::If 条件は、テンプレートの Resources セクションと Outputs セクションのメタデータ属性、更新ポリシー属性、およびプロパティ値で使用できます。

テスト環境と本稼働環境など、異なるコンテキストでリソースを作成できるテンプレートを再利用する場合に、条件を使用することがあります。テンプレートで EnvironmentType 入力パラメータを追加できます。このパラメータは入力として prod または test を受け取ります。本稼働環境では特定の機能に Amazon EC2 インスタンスを含め、テスト環境ではコスト削減のために使用する機能数を少なくする場合があります。条件を使用すると、どのリソースを作成するかや、それらを各環境タイプでどのように設定するかを定義できます。

Conditions セクションの詳細については、「条件」を参照してください。

注記

パラメーターやテンプレートの Mappings セクションからは、他の条件と値のみを参照できます。たとえば、入力パラメーターの値は参照できますが、条件内のリソースの論理 ID は参照できません。

条件の関連付け

条件付きでリソースやリソースプロパティ、出力を作成するには、条件をそれらに関連付ける必要があります。次のスニペットで示すように、条件に関連付ける属性として Condition: キーと条件の論理 ID を追加してください。AWS CloudFormation は、NewVolume リソースを CreateProdResources 条件が true に評価される場合にだけ作成します。

例 JSON

"NewVolume" : { "Type" : "AWS::EC2::Volume", "Condition" : "CreateProdResources", "Properties" : { "Size" : "100", "AvailabilityZone" : { "Fn::GetAtt" : [ "EC2Instance", "AvailabilityZone" ]} }

例 YAML

NewVolume: Type: "AWS::EC2::Volume" Condition: CreateProdResources Properties: Size: 100 AvailabilityZone: !GetAtt EC2Instance.AvailabilityZone

Fn::If 関数では、条件名のみを指定する必要があります。次のスニペットは、Fn::If を条件付きで使用してリソースプロパティを指定する方法を示します。CreateLargeSize 条件が true の場合、AWS CloudFormation はボリュームサイズを 100 に設定します。AWS CloudFormation 条件が false の場合は、ボリュームサイズが 10 に設定されます。

例 JSON

"NewVolume" : { "Type" : "AWS::EC2::Volume", "Properties" : { "Size" : { "Fn::If" : [ "CreateLargeSize", "100", "10" ]}, "AvailabilityZone" : { "Fn::GetAtt" : [ "Ec2Instance", "AvailabilityZone" ]} }, "DeletionPolicy" : "Snapshot" }

例 YAML

NewVolume: Type: "AWS::EC2::Volume" Properties: Size: !If [CreateLargeSize, 100, 10] AvailabilityZone: !GetAtt: Ec2Instance.AvailabilityZone DeletionPolicy: Snapshot

その他の条件内の条件も使用できます。次のスニペットは、テンプレートの Conditions セクションからのものです。MyAndCondition 条件には、SomeOtherCondition 条件が含まれています:

例 JSON

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

例 YAML

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

Fn::And

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

宣言

JSON

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

YAML

完全名関数の構文:

Fn::And: [condition]

短縮形の構文:

!And [condition]

パラメータ

condition

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

次の 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

比較する任意の型の値です。

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

JSON

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

YAML

UseProdCondition: !Equals [!Ref EnvironmentType, prod]

Fn::If

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

宣言

JSON

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

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 に評価された場合に返される値です。

追加のサンプルを表示するには、「サンプルテンプレート」を参照してください。

例 1

次のスニペットは、Amazon EC2 リソースの SecurityGroups プロパティで Fn::If 関数を使用します。CreateNewSecurityGroup 条件が true に評価される場合は、AWS CloudFormation では SecurityGroups プロパティを指定するために NewSecurityGroup の参照されている値が使用されます。そうでない場合は、ExistingSecurityGroup の参照されている値が AWS CloudFormation で使用されます。

JSON
"SecurityGroups" : [{ "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroup"} ] }]
YAML
SecurityGroups: - !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup]

例 2

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

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

例 3

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

JSON
"MyDB" : { "Type" : "AWS::RDS::DBInstance", "Properties" : { "AllocatedStorage" : "5", "DBInstanceClass" : "db.m1.small", "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : { "Ref" : "DBUser" }, "MasterUserPassword" : { "Ref" : "DBPassword" }, "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" }, "DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] } } }
YAML
MyDB: Type: "AWS::RDS::DBInstance" Properties: AllocatedStorage: 5 DBInstanceClass: db.m1.small Engine: MySQL EngineVersion: 5.5 MasterUsername: !Ref DBUser MasterUserPassword: !Ref DBPassword DBParameterGroupName: !Ref MyRDSParamGroup DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"]

例 4

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

JSON
"UpdatePolicy": { "AutoScalingRollingUpdate": { "Fn::If": [ "RollingUpdates", { "MaxBatchSize": "2", "MinInstancesInService": "2", "PauseTime": "PT0M30S" }, { "Ref" : "AWS::NoValue" } ] } }
YAML
UpdatePolicy: AutoScalingRollingUpdate: !If - RollingUpdates - 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 のような条件です。

次の 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 に評価される条件です。

次の 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

  • そのほかの条件関数