在我的模板中,我传递了CommaDelimitedList
个帐户ID作为参数。
我希望做一些Fn::Join
和/或Fn::Sub
魔术来改变列表,如下所示:
"Accounts" : {
"Type" : "CommaDelimitedList",
"Default" : "12222234,23333334,1122143234,..."
}
To be used in the template as a list `root` ARN's as :
[
"arn:aws:iam::12222234:root"
"arn:aws:iam::23333334:root"
"arn:aws:iam::1122143234:root"
]
现在我正在传递完整的ARN,所以它正在运行,但它很糟糕。然而,CFN内置功能在这方面证明非常困难。
任何人都有类似这样的代码吗?
答案 0 :(得分:2)
我能够调整Sam Hammamy现有的答案来解决使用Fn::Sub
对第一个和最后一个项目进行特殊处理的限制。您还可以合并两个Join
。
在YAML:
AWS: !Split
- ','
- !Sub
- 'arn:aws:iam::${inner}:root'
- inner: !Join
- ':root,arn:aws:iam::'
- Ref: "Accounts"
在JSON中:
"Fn::Split": [
",",
{
"Fn::Sub": [
"arn:aws:iam::${rest}:root",
{
"rest": {
"Fn::Join": [
":root,arn:aws:iam::",
{ "Ref": "Accounts" }
]
}
}
]
}
]
答案 1 :(得分:1)
以下是有效的,但它有很大的局限性:
由于Fn::Join
函数的性质,它将分隔符放在列表的元素之间。因此,第一个和最后一个元素需要特殊处理,如:
"arn:aws:iam::xxxxx,yyyyy,zzzzzz,fffffff:root"
"Principal": {
"AWS":{
"Fn::Split" :
[",",
{"Fn::Join" : [",arn:aws:iam::",
{
"Fn::Split" :
[",",
{"Fn::Join" :
[":root,", {"Ref": "Accounts"}]}
]
}
]}
]
}
}
不是很好,但比以前更好。
答案 2 :(得分:1)
仅想增加几年后,上述@borkl的回复对我也基本有效,但是我必须从我的案例的AWS支持中寻求帮助。以为我会在这里学习。
注意:参数的类型为CommaDelimitedList
基本上,过程是这样的:
我想将托管策略名称列表转换为arns,这样:
!Split
- ","
- -!Sub
- arn:aws:iam::aws:policy/${rest}
- rest:
!Join
- ",arn:aws:iam::aws:policy/"
- !Ref AWSManagedPolicies
希望这对某人或将来对我有帮助;)