【问题标题】:CloudFormation Magic to Generate A List of ARNs from a List of Account IdsCloudFormation Magic 从账户 ID 列表生成 ARN 列表
【发布时间】:2021-09-24 14:02:27
【问题描述】:

在我的模板中,我将帐户 ID 的 CommaDelimitedList 作为参数传递。

我希望做一些 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 内置函数很难做到这一点。

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

【问题讨论】:

    标签: amazon-cloudformation


    【解决方案1】:

    我能够通过使用 Fn::Sub 来调整 Sam Hammamy 的现有答案,以解决需要对第一个和最后一个项目进行特殊处理的限制。您也可以合并两个Joins。

    在 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" }
                        ]
                    }
                }
            ]
        }
    ]
    

    【讨论】:

    • 这救了我的培根。很棒的小sn-p代码。谢谢!
    【解决方案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"}]}
                                 ]
                        }
                    ]}
                ]
                }
    }
    

    不是很好,但比以前更好。

    【讨论】:

      【解决方案3】:

      只是想在几年后补充一点,@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
      

      希望这对某人有所帮助,甚至对我将来有所帮助;)

      【讨论】:

        【解决方案4】:

        ${rest} 不必尾随。

        我想为多个帐户创建一个带有 Trusts 的 AssumeRolePolicyDocument,并设法将其组合在一起。

        !Split:
          - ","
          - !Sub:
              - arn:aws:iam::${rest}:root
              - rest:
                  !Join:
                    - ":root,arn:aws:iam::"
                    - Ref: TrustRelationships
        

        这个魔法并没有真正记录在案,但它是一个非常有用的技巧。

        【讨论】:

          猜你喜欢
          • 2018-11-13
          • 1970-01-01
          • 2016-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多