如何将 'Always Required' 值添加到 CommaDelimitedList

How to add 'Always Required' Values to a CommaDelimitedList

我正在尝试创建一个 IAM Policy for limiting access to selected S3 Buckets. There are some default S3 Bucket ARNs, that must always be present, the template operator is allowed to add a list of additional Bucket ARNs to grant access to, through a Parameter

在我的模板中,BucketARNs Parameter 允许操作员指定长度不受限制的 ARN 列表。

  BucketARNs:
    Type: CommaDelimitedList
    Description: 'Add the ARN of S3 Buckets that the Get* and List*
      access to. When specifying a Bucket 2 values should be supplied one for the
      bucket and for objects within that bucket, for example: arn:aws:s3:::MyContentBucket,arn:aws:s3:::MyContentBucket/*  .
      This defaults to all buckets.'
    Default: arn:aws:s3:::*, arn:aws:s3:::*/*

使用这个 Parameter 的策略文档看起来像

PolicyDocument:
  Version: '2012-10-17'
  Statement:
  - Effect: Allow
    Action:
    - s3:Get*
    - s3:List*
    Resource:
      !Ref BucketARNs

我想做的是确保,例如

arn:aws:s3:::MyMustHaveBucket,
arn:aws:s3:::MyMustHaveBucket/*

ARN 总是 出现在 BucketARNs 的列表中。 Parameter 中的 Default 可以由操作员删除 - 是将它们添加为 Default 值并在 Parameter Description 警告中添加信息的唯一解决方案用户不删除所需的 ARN?哪一样容易坏。

有谁知道确保我始终可以使用这些工具的方法吗?考虑到通过 Parameter 指定的 BucketARN 列表是可变的?

理想情况下,我想要一个列表连接函数

使用FN::join连接常量与参数

两个选项:

  1. 您可以在 String 参数上使用 AllowedPattern 以及 Default 值以确保提供的默认值始终包含在提供的参数中,然后在您的模板中使用时,使用 Fn::Split 将参数解析为数组:

    Parameters:
      BucketARNs:
        Type: String
        Default: arn:aws:s3:::*, arn:aws:s3:::*/*
        AllowedPattern: arn:aws:s3:::\*, arn:aws:s3:::\*\/\*.*
    Resources:
      Dummy:
        Type: AWS::CloudFormation::WaitConditionHandle
    Outputs:
      Result:
        Value: !Join [',', !Split [',', !Ref BucketARNs]]
    
  2. 您可以使用 Fn::Split along with Fn::SubFn::Join 将固定值附加到 user-supplied 参数:

    Parameters:
      BucketARNs:
        Type: CommaDelimitedList
    Resources:
      Dummy:
        Type: AWS::CloudFormation::WaitConditionHandle
    Outputs:
      Result:
        Value: !Join [',', !Split [',', !Sub [
          "arn:aws:s3:::*,arn:aws:s3:::*/*,${Buckets}",
          {Buckets: !Join [',', !Ref BucketARNs]}
        ]]]
    

上述示例中的最后一个 !Join 仅用于在堆栈输出中输出数组,在模板的实际 属性 输入中使用参数时不需要它们。