条件由Fn::And、Fn::Or、Fn::Not或Fn::Equals定义,根据您在创建或更新资源栈时,指定的输入参数值进行计算。在每个条件中,都可以引用其他条件、参数值或映射。
语法
每个条件由条件名和条件本身组成,其中条件名是字符串类型。多个条件用半角逗号(,)隔开,每个条件名不能重复。
模板的Resources和Outputs部分,将条件与资源关联起来。条件和资源的关联通过两种方式实现:Fn::If函数或者资源的Condition字段。
允许使用如下函数,但不能是最外层的函数:
Fn::Select、 Fn::Join、 Fn::Split、Fn::Replace、Fn::Base64Encode、Fn::Base64Decode、Fn::MemberListToMap、Fn::If、 Fn::ListMerge、 Fn::GetJsonValue、Fn::MergeMapToList、Fn::SelectMapList、Fn::Add、Fn::Avg、Fn::Str、Fn::Calculate、Ref(仅参数引用)、Fn:: FindInMap、Fn::Max、Fn::Min。
示例
- 设置Conditions
"Conditions" : { "DevEnv": {"Fn::Equals": ["Dev", {"Ref": "EnvType"}]}, "UTEnv": {"Fn::Equals": ["UT", {"Ref": "EnvType"}]}, "PREEnv": {"Fn::Not": {"Fn::Or": ["DevEnv", "UTEnv"]}}, "ProdEnv": {"Fn::And": [{"Fn::Equals": ["Prod", {"Ref": "EnvType"}]}, "PREEnv"]} }
- 关联Conditions和Resources
本示例中,根据EnvType参数值决定是否为ECS instance创建数据盘和OSS bucket。
{ "ROSTemplateFormatVersion":"2015-09-01", "Parameters":{ "EnvType":{ "Default":"pre", "Type":"String" } }, "Conditions":{ "CreateProdRes":{ "Fn::Equals":[ "prod", { "Ref":"EnvType" } ] } }, "Resources":{ "WebServer":{ "Type":"ALIYUN::ECS::Instance", "Properties":{ "DiskMappings":{ "Fn::If":[ "CreateProdRes", [ { "Category":"cloud_efficiency", "DiskName":"FirstDataDiskName", "Size":40 }, { "Category":"cloud_ssd", "DiskName":"SecondDataDiskName", "Size":40 } ], { "Ref":"ALIYUN::NoValue" } ] }, "VpcId":"vpc-2zew9pxh2yirtzqxd****", "SystemDiskCategory":"cloud_efficiency", "SecurityGroupId":"sg-2zece6wcqriejf1v****", "SystemDiskSize":40, "ImageId":"centos_6_8_64_40G_base_2017****.vhd", "IoOptimized":"optimized", "VSwitchId":"vsw-2zed9txvy7h2srqo6****", "InstanceType":"ecs.n1.medium" } }, "OssBucket": { "Type": "ALIYUN::OSS::Bucket", "Condition": "CreateProdRes", "Properties": { "AccessControl": "private", "BucketName": "myprodbucket" } } }, "Outputs":{ "InstanceId":{ "Value":{ "Fn::GetAtt":[ "WebServer", "InstanceId" ] } }, "OssDomain":{ "Condition": "CreateProdRes", "Value":{ "Fn::GetAtt":[ "OssBucket", "DomainName" ] } } } }