CloudFormation Magic 从账户 ID 列表生成 ARN 列表

Sam*_*amy 4 aws-cloudformation

在我的模板中,我将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"
 ]
Run Code Online (Sandbox Code Playgroud)

现在我正在传递完整的 ARN,所以它正在工作,但它很笨拙。然而事实证明,CFN 内置函数很难做到这一点。

任何人都有这样的代码?

小智 9

我能够调整 Sam Hammamy 的现有答案,以解决需要使用Fn::Sub. 您还可以组合两个Joins。

在 YAML 中:

AWS: !Split
  - ','
  - !Sub
    - 'arn:aws:iam::${inner}:root'
    - inner: !Join
      - ':root,arn:aws:iam::'
      - Ref: "Accounts"
Run Code Online (Sandbox Code Playgroud)

在 JSON 中:

"Fn::Split": [
    ",", 
    {
        "Fn::Sub": [
            "arn:aws:iam::${rest}:root", 
            {
                "rest": {
                    "Fn::Join": [
                        ":root,arn:aws:iam::", 
                        { "Ref": "Accounts" }
                    ]
                }
            }
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)


Sam*_*amy 2

下面的方法有效,但它有一个很大的限制:

由于该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"}]}
                             ]
                    }
                ]}
            ]
            }
}
Run Code Online (Sandbox Code Playgroud)

不是很好,但比以前好多了。