Fn::If
、Fn::Equals
、Fn::Not
などの組み込み関数を使用して、条件付きでスタックリソースを作成できます。これらの条件は、スタックを作成または更新するときに宣言する入力パラメーターに基づいて評価されます。必要な条件をすべて定義したら、テンプレートの Resources セクションと Outputs セクションでそれらをリソースまたはリソースプロパティに関連付けることができます。
Fn::If
条件を除くすべての条件は、テンプレートの Conditions セクションで定義します。Fn::If
条件は、テンプレートの Resources セクションと Outputs セクションのメタデータ属性、更新ポリシー属性、およびプロパティ値で使用できます。
テスト環境と本稼働環境など、異なるコンテキストでリソースを作成できるテンプレートを再利用する場合に、条件を使用することがあります。テンプレートで EnvironmentType
入力パラメータを追加できます。このパラメータは入力として prod
または test
を受け取ります。本稼働環境では特定の機能に Amazon EC2 インスタンスを含め、テスト環境ではコスト削減のために使用する機能数を少なくする場合があります。条件を使用すると、どのリソースを作成するかや、それらを各環境タイプでどのように設定するかを定義できます。
Conditions セクションの詳細については、「CloudFormation テンプレートの 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
関数では、条件名のみを指定する必要があります。次のスニペットは、Fn::If
を条件付きで使用してリソースプロパティを指定する方法を示します。CreateLargeSize
条件が true の場合、CloudFormation はボリュームサイズを 100
に設定します。条件が false の場合は、CloudFormation はボリュームサイズを 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:
'Fn::If':
- CreateLargeSize
- '100'
- '10'
AvailabilityZone:
'Fn::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
}, {...
}]
パラメータ
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 つの値を返します。現在、CloudFormation では、メタデータ属性、更新ポリシー属性、およびテンプレートの [Resources] (リソース) セクションと [Outputs] (出力) セクションのプロパティ値で 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 に評価される場合は、CloudFormation では SecurityGroups
プロパティを指定するために NewSecurityGroup
の参照されている値が使用されます。そうでない場合は、ExistingSecurityGroup
の参照されている値が CloudFormation で使用されます。
JSON
"SecurityGroups" : [{
"Fn::If" : [
"CreateNewSecurityGroup",
{"Ref" : "NewSecurityGroup"},
{"Ref" : "ExistingSecurityGroup"}
]
}]
YAML
SecurityGroups:
- !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup]
例 2
テンプレートの Outputs セクションでは、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" : "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 に評価された場合は、CloudFormation は DBSnapshotIdentifier
プロパティに DBSnapshotName
パラメータ値を使用します。条件が false に評価された場合は、CloudFormation は DBSnapshotIdentifier
プロパティを削除します。
JSON
"MyDB" : {
"Type" : "AWS::RDS::DBInstance",
"Properties" : {
"AllocatedStorage" : "5",
"DBInstanceClass" : "db.t2.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.t2.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 に評価される場合は、CloudFormation は AutoScalingRollingUpdate
更新ポリシーを削除します。
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
}]
パラメータ
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::Equals
や Fn::Or
など他のすべての条件で次の関数を使用できます。
-
Fn::FindInMap
-
Ref
-
そのほかの条件関数