在 AWS Cloudformation 中如何在 s3 存储桶策略的 NotIpAddress 条件中使用多个 if 语句

问题描述

一个要求,我必须创建一个 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 函数将我们的参数分配给映射。

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

解决方法

您应该为此使用 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 中找到更多信息。