我们面临的问题是预先存在的安全组数量不总是相同的,而我们希望有一个单一的模板来处理所有情况。
目前,我们有一个输入参数,看起来像这样:
"WebTierSgAdditional": {
"Type": "String",
"Default": "",
"Description": ""
}
我们将一个逗号分隔的字符串传入该参数,其中包含预先存在的安全组,例如'sg-abc123,sg-abc456'
。
EC2实例的SecurityGroup标签看起来像这样:
"SecurityGroups": [
{
"Ref": "WebSg"
},
{
"Ref": "WebTierSgAdditional"
}
]
使用此代码时,当实例创建时,我们会在AWS控制台中收到以下错误:
必须同时使用组ID或组名称才能使用所有安全组,而不是同时使用两者
上面的“WebSg”引用是模板中其他地方正在创建的安全组之一。如果我们通过输入参数传递组名称列表而不是组ID列表,则会出现相同的错误。
当我们将输入参数的“Type”字段更改为“CommaDelimitedList”时,会收到一个错误,其中包含以下信息:
属性SecurityGroups的值必须是字符串列表类型
显然无法将一个列表与一个字符串连接起来以创建一个新列表。
当参数仅包含单个sg id时,一切都可以成功创建,但是我们需要具有添加多个sg id的功能。
我们尝试了许多不同的方法,在SecurityGroups标记内使用Fn::Join
,但似乎没有任何作用。我们真正需要的是一种“Explode”函数,以从参数字符串中提取单个ID。
有人知道一种好的使这个工作的方法吗?