【问题标题】:How to add 'Always Required' Values to a CommaDelimitedList如何将“始终需要”值添加到 CommaDelimitedList
【发布时间】:2017-03-03 22:21:00
【问题描述】:

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

在我的模板中,BucketARNsParameter 允许操作员指定长度不受限制的 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 列表是可变的?

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

【问题讨论】:

    标签: amazon-cloudformation


    【解决方案1】:

    两种选择:

    1. 您可以在 String 参数上使用 AllowedPatternDefault 值以确保提供的默认值始终包含在提供的参数中,然后在使用时使用 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 以及Fn::SubFn::Join 将您的固定值附加到用户提供的参数:

      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只是在堆栈输出中输出数组,在模板的实际属性输入中使用参数时不需要它们。

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-06-22
      • 2011-03-16
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 2013-01-19
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多