AWS CloudFormation
User Guide (API Version 2010-05-15)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

条件

可选的 Conditions 部分包括在创建资源或定义属性时定义的语句。例如,您可比较一个值是否等于另一个值。根据该条件结果,您可以按条件创建资源。如果您有多个条件,请用逗号将它们分隔开。

当您需要重新使用可在不同环境(如测试环境与生产环境)中创建资源的模板时,可能会使用条件。在模板中,您可以添加 EnvironmentType 输入参数,它接受 prodtest 作为输入。对于生产环境,您可以包括带特定功能的 Amazon EC2 实例;但对于测试环境,您需要使用更少的功能来节约资金。使用条件,您可以定义对每个环境类型创建哪些资源以及如何配置它们。

条件根据您在创建或更新堆栈时指定的输入参数值进行计算。在每个条件中都可以引用其他条件、参数值或映射。定义所有条件后,您可以在模板的 ResourcesOutputs 部分将它们与资源和资源属性关联起来。

在创建或更新堆栈时,AWS CloudFormation 先计算模板中的所有条件,然后再创建资源。会创建与 true 条件关联的所有资源,忽略与 false 条件关联的所有资源。

重要

堆栈更新期间,您无法更新条件本身。您只能在包含添加、修改或删除资源的更改时更新条件。

条件使用方式概述

要有条件地创建资源,您必须在模板中至少三个不同的部分提供语句:

Parameters 部分

定义要在条件中求值的输入值。条件将基于来自这些输入参数的值计算为 true 或 false。

Conditions 部分

使用内部条件函数定义条件。这些条件确定 AWS CloudFormation 何时创建关联的资源。

ResourcesOutputs 部分

将条件关联到要有条件地创建的资源或输出。AWS CloudFormation 创建与 true 条件关联的实体,忽略与 false 条件关联的实体。使用 Condition 键和条件的逻辑 ID 将其关联到资源或输出。要有条件地指定属性,请使用 Fn::If 函数。有关更多信息,请参阅 条件函数

语法

Conditions 部分包括键名称 Conditions。每个条件声明均包括一个逻辑 ID 和多个在创建或更新堆栈时计算的内部函数。以下伪模板概述了 Conditions 部分:

JSON

"Conditions" : { "Logical ID" : {Intrinsic function} }

YAML

Conditions: Logical ID: Intrinsic function

条件内部函数

您可以使用以下内部函数定义条件:

  • Fn::And

  • Fn::Equals

  • Fn::If

  • Fn::Not

  • Fn::Or

有关每个函数的语法和信息,请参阅条件函数

注意

仅模板的 Resources 部分和 Outputs 部分中的元数据属性、更新策略属性和属性值中支持 Fn::If

示例

下面的示例模板包含一个 EnvType 输入参数,在这里可以指定 prod 来创建生产堆栈,或指定 test 来创建测试堆栈。对于生产环境,AWS CloudFormation 会创建一个 Amazon EC2 实例并向该实例附加一个卷。对于测试环境,AWS CloudFormation 将只创建 Amazon EC2 实例。

如果 CreateProdResources 参数与 true 相等,EnvType 条件将计算为 prod。在示例模板中,NewVolumeMountPoint 资源与 CreateProdResources 条件关联。因此,仅当 EnvType 参数等于 prod 时才会创建资源。

JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Mappings" : { "RegionMap" : { "us-east-1" : { "AMI" : "ami-7f418316", "TestAz" : "us-east-1a" }, "us-west-1" : { "AMI" : "ami-951945d0", "TestAz" : "us-west-1a" }, "us-west-2" : { "AMI" : "ami-16fd7026", "TestAz" : "us-west-2a" }, "eu-west-1" : { "AMI" : "ami-24506250", "TestAz" : "eu-west-1a" }, "sa-east-1" : { "AMI" : "ami-3e3be423", "TestAz" : "sa-east-1a" }, "ap-southeast-1" : { "AMI" : "ami-74dda626", "TestAz" : "ap-southeast-1a" }, "ap-southeast-2" : { "AMI" : "ami-b3990e89", "TestAz" : "ap-southeast-2a" }, "ap-northeast-1" : { "AMI" : "ami-dcfa4edd", "TestAz" : "ap-northeast-1a" } } }, "Parameters" : { "EnvType" : { "Description" : "Environment type.", "Default" : "test", "Type" : "String", "AllowedValues" : ["prod", "test"], "ConstraintDescription" : "must specify prod or test." } }, "Conditions" : { "CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "prod"]} }, "Resources" : { "EC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]} } }, "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" ]} } } }, "Outputs" : { "VolumeId" : { "Value" : { "Ref" : "NewVolume" }, "Condition" : "CreateProdResources" } } }

YAML

AWSTemplateFormatVersion: "2010-09-09" Mappings: RegionMap: us-east-1: AMI: "ami-7f418316" TestAz: "us-east-1a" us-west-1: AMI: "ami-951945d0" TestAz: "us-west-1a" us-west-2: AMI: "ami-16fd7026" TestAz: "us-west-2a" eu-west-1: AMI: "ami-24506250" TestAz: "eu-west-1a" sa-east-1: AMI: "ami-3e3be423" TestAz: "sa-east-1a" ap-southeast-1: AMI: "ami-74dda626" TestAz: "ap-southeast-1a" ap-southeast-2: AMI: "ami-b3990e89" TestAz: "ap-southeast-2a" ap-northeast-1: AMI: "ami-dcfa4edd" TestAz: "ap-northeast-1a" Parameters: EnvType: Description: Environment type. Default: test Type: String AllowedValues: - prod - test ConstraintDescription: must specify prod or test. Conditions: CreateProdResources: !Equals [ !Ref EnvType, prod ] Resources: EC2Instance: Type: "AWS::EC2::Instance" Properties: ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI] 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 Outputs: VolumeId: Condition: CreateProdResources Value: !Ref NewVolume