これは新しい AWS CloudFormation テンプレートリファレンスガイドです。ブックマークとリンクを更新してください。CloudFormation の開始方法については、『AWS CloudFormation ユーザーガイド』を参照してください。
条件関数
Fn::If
、Fn::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
}, {...
}]
パラメータ
- 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
擬似パラメーターを使用できます。
宣言
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
に評価された場合に返される値です。
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
}]
パラメータ
- 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::Equals
や Fn::Or
など他のすべての条件で次の関数を使用できます。
-
Fn::FindInMap
-
Ref
-
そのほかの条件関数
サンプルテンプレート
条件付きで、本稼働用、開発用、またはテスト用のスタックのリソースを作成します。
場合によっては、似てはいるものの、微調整したスタックを作成することがあります。たとえば、本稼働用アプリケーションに使用するテンプレートがあるとします。開発またはテスト用に、同じ本稼働用スタックを作成します。ただし、開発やテストでは、本稼働レベルのスタックに含まれている余分な容量のすべては必要としません。代わりに、次の例に示すように環境タイプ入力パラメータを使用して、条件付きで本稼働、開発、およびテストに固有のスタックリソースを作成できます。
prod
パラメーターには、dev
、test
、または 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 属性」トピックを参照してください。