我正在使用CloudFormation将ELB部署到预先存在的具有预先存在的子网的VPC。 我已经在模板的Mappings部分列出了子网,并根据Environment参数select映射。 这工作正常,如果映射是一个单一的值,但我希望映射返回一个列表,因为我希望ELB是多可用区。 我已经尝试了下面的例子的各种组合,但我总是得到相同的错误Value of property Subnets must be of type List of String 。 有没有一种方法,FindInMap可以返回一个值列表?
示例ELBconfiguration
"ElasticLoadBalancerAPI": { "Properties": { "ConnectionDrainingPolicy": { "Enabled": true, "Timeout": 30 }, "ConnectionSettings": { "IdleTimeout": 60 }, "CrossZone": "false", "Subnets" : [ { "Fn::FindInMap": [ "AWSEnv2PublicSubnets", { "Ref": "Env" }, "subList" ] } ], "SecurityGroups" : [ { "Ref" : "LoadBalancerSecurityGroup" }], etc...
示例参数
"Parameters": { "Env": { "Description": "Environment", "Type": "String", "Default": "DEV", "AllowedValues": [ "DEV", "TEST" ] } }
示例映射
"Mappings": { "AWSEnv2PublicSubnets": { "DEV": { "subList": ["subnet-1111","subnet-2222","subnet-3333"] }, "TEST": { "subList": ["subnet-4444"] } } }
使用分割function的作品:
"Mappings": { "AWSEnv2PublicSubnets": { "DEV": { "subList": "subnet-1111,subnet-2222,subnet-3333" } } }
然后:
"Subnets" : { "Fn::Split" : [ ",", { "Fn::FindInMap": [ "AWSEnv2PublicSubnets", { "Ref": "Env" }, "subList" ] } ] }
Mappings: AWSEnv2PublicSubnets: DEV: subList: subnet-1111,subnet-2222,subnet-3333
然后:
Subnets: !Split [",", !FindInMap [ AWSEnv2PublicSubnets, !Ref Env, subList] ]
我用一个逗号( , )作为分隔符,但只要它不被用作值的一部分,就可以使用任何你想要的东西。