我们有一个CloudFormation模板,用于创建EC2实例和安全组(以及许多其他资源),但我们需要能够向同一个EC2实例添加一些其他预先存在的安全组.
我们遇到的问题是,预先存在的安全组的数量并不总是相同,我们希望有一个模板来处理所有情况.
目前,我们有一个输入参数,如下所示:
"WebTierSgAdditional": {
"Type": "String",
"Default": "",
"Description": ""
}
Run Code Online (Sandbox Code Playgroud)
我们将此参数传递给逗号分隔的预先存在的安全组字符串,例如'sg-abc123,sg-abc456'
.
EC2实例的SecurityGroup标记如下所示:
"SecurityGroups": [
{
"Ref": "WebSg"
},
{
"Ref": "WebTierSgAdditional"
}
]
Run Code Online (Sandbox Code Playgroud)
使用此代码,在创建实例时,我们会在AWS控制台中收到此错误:
必须对所有安全组使用group-id或group-name,而不是同时使用
上面的'WebSg'参考是在模板中其他地方创建的安全组之一.如果我们通过输入参数传入组名列表而不是组ID列表,则会出现同样的错误.
当我们将输入参数的"类型"字段更改为"CommaDelimitedList"时,我们会收到错误消息:
属性值SecurityGroups的类型必须是List of String
它显然无法使用字符串连接列表以使其成为新列表.
当参数只包含一个sg id时,所有内容都会成功创建,但是,我们需要能够添加多个sg id.
我们Fn::Join
在SecurityGroups标记中尝试了许多不同的使用组合,但似乎没有任何效果.我们真正需要的是某种"爆炸"功能,用于从参数字符串中提取单个id.
有谁知道一个很好的方法让这个工作?