【问题标题】:in AWS Cloudformation how to use multiple if statement in NotIpAddress condition in s3 bucket policy在 AWS Cloudformation 如何在 s3 存储桶策略中的 NotIpAddress 条件中使用多个 if 语句
【发布时间】:2021-10-06 01:15:04
【问题描述】:

有一个要求,我必须创建一个 Cloudformation 堆栈集,该堆栈集将在多个 AWS 区域中创建一个 S3 存储桶。

但这里的问题是我想将所有 AWS 区域的所有 S3 存储桶中的 IP 地址列入白名单,并且每个 AWS 区域的 IP 地址都不同。

所以,我定义了多个参数,这些参数将从用户那里获取一个 IP 地址。我还为其 AWS 区域定义了一个条件。因此,假设通过 stackset 部署的堆栈位于 us-east-1 区域,那么 us-east-1 的条件将返回 true。现在,我在 S3 存储桶策略中给出“!if”语句,以便如果堆栈部署在 us-east-1 区域中,则将执行特定的 is 语句。

以下是 S3 存储桶策略条件:-

Condition: 
              NotIpAddress:
                aws:SourceIp:
                  - !If [IsUSEast1, !Ref S3IPAddressUSEast1ToWhitelist, !Ref "AWS::NoValue"]
                  - !If [IsUSEast2,      !Ref S3IPAddressUSEast2ToWhitelist,      !Ref "AWS::NoValue"]
                  - !If [IsUSWest1,      !Ref S3IPAddressUSWest1ToWhitelist,      !Ref "AWS::NoValue"]
                  - !If [IsUSWest2,      !Ref S3IPAddressUSWest2ToWhitelist,      !Ref "AWS::NoValue"]
                  - !If [IsEUCentral1,   !Ref S3IPAddressEUCentral1ToWhitelist,   !Ref "AWS::NoValue"]
                  - !If [IsEUWest1,      !Ref S3IPAddressEUWest1ToWhitelist,      !Ref "AWS::NoValue"]

正如您在上面看到的,如果正在部署的 Cloudformation 堆栈位于 us-east-1 区域,则将执行第一个“!if”语句,并将使用“S3IPAddressUSEast1ToWhitelist”参数。但这在我的情况下不起作用,似乎“aws:SourceIp”只允许执行一个“!if”语句。我还尝试了各种其他方法,例如映射,但在这里我们不能使用 !Ref 函数将我们的参数分配给映射。

如果有人可以帮助解决这个问题,我会很高兴。

【问题讨论】:

    标签: amazon-s3 amazon-cloudformation amazon-iam


    【解决方案1】:

    您应该为此使用 CloudFormation 地图:

    Mappings: 
      IPAddresses: 
        us-east-1: 
          IP: 0.0.0.0
        us-east-2: 
          IP: 1.1.1.1.
        [...]: 
          IP: ...
    

    然后您可以使用检索值

    !FindInMap [IPAddresses, !Ref "AWS::Region", IP]
    

    更多信息可以在here找到。

    (编辑)

    如果您想为 IP 地址的值使用参数,您可以简单地使用单个参数并根据您的部署位置覆盖参数值。更多信息可以在here找到。

    【讨论】:

    • 感谢您的回复。是的,我也知道这种方法,但我想避免这种方法,只想使用参数。因此,如果有任何新的 IP 地址出现在图片中,那么用户应该通过参数添加它,他们不需要再次编辑模板来添加 IP 地址。
    • 我认为在这种情况下你应该选择一个参数,我已经更新了我上面的答案以包含这种可能性。
    • 嗨@stijndepestel,谢谢,这会有所帮助。但是这里有一个问题,我们打算使用 CodePipeline 来更新 cloudformation 堆栈集。我找到了一个文档来覆盖参数值,但在这里它如何知道应该更新哪个 AWS 区域 cloudformation 堆栈参数。以下是相同的链接。 docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
    • 文档说明 Overridden parameter values are applied to all stack instances in the specified accounts and Regions. 因此在这种情况下,您最好的选择是使用 Mappings 解决方案。一种解决方法是使用不同的 CodePipelines 而不是作为 StackSet 进行部署。但这似乎比在需要更新 IP 地址时简单地更新模板文件更有效。由于您使用的是 CodePipeline,我认为更新 IP 也将构成在某处提交。这还有一个额外的好处,那就是有一个变更跟踪,这也很有价值。
    • 是的,我们正在使用 Codecommit 提交我们的更改,这将触发我们的 CodePipeline。似乎唯一的选择是使用映射并将我们的 IP 地址放在那里。
    猜你喜欢
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    相关资源
    最近更新 更多