如何将“始终必需”值添加到CommaDelimitedList

时间:2017-02-15 12:28:43

标签: amazon-cloudformation

我正在尝试创建一个IAM Policy来限制对所选S3存储桶的访问。有一些默认S3 Bucket ARNs,必须始终,模板运营商可以通过{{3}添加额外Bucket ARNs的列表以授予访问权限}。

在我的模板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在<{1}}列表中始终。运营商可以删除Parameter中的BucketARNs - 唯一的解决方案是将其添加为Default值,并在Parameter Default警告中添加信息用户不要删除所需的ARN?这很容易被打破。

有没有人知道如何确保我始终拥有这些?考虑通过Parameter指定的BucketARN列表是可变的吗?

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

2 个答案:

答案 0 :(得分:1)

两个选项:

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

    Fn::Split
  2. 您可以使用Fn::Split以及Fn::SubParameters: 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]] 将固定值附加到用户提供的参数:

    Fn::Join
  3. 上述示例中的最后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]} ]]] 仅用于在堆栈输出中输出数组,在模板的实际属性输入中使用参数时不需要它们。

答案 1 :(得分:0)

使用FN :: join将常量与参数

连接起来