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

时间:2018-02-23 14:36:34

标签: amazon-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"
 ]

现在我正在传递完整的ARN,所以它正在运行,但它很糟糕。然而,CFN内置功能在这方面证明非常困难。

任何人都有类似这样的代码吗?

3 个答案:

答案 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

基本上,过程是这样的:

  1. 在第一项中添加一些内容,比如说“ arn :: something :::”
  2. 用',arn :: something :::'替换逗号<-注意逗号
  3. 以逗号分隔

我想将托管策略名称列表转换为arns,这样:

!Split
  - ","
  - -!Sub
    - arn:aws:iam::aws:policy/${rest}
    - rest:
        !Join
          - ",arn:aws:iam::aws:policy/"
          - !Ref AWSManagedPolicies

希望这对某人或将来对我有帮助;)