首页 > 解决方案 > 选择具有工作区的 AZ

问题描述

我们有部署到 3 个区域的 CloudFromation 模板,我们使用 !GetAZs 内部函数,如下所示:

  PrivateSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: !Ref 'PrivateSubnetCIDR2'
      AvailabilityZone: !Select
        - '1'
        - !GetAZs ''
      Tags:
        - Key: Name
          Value: Private-Subnet-2
      VpcId: !Ref 'VPC'

我们设置了 2 个子网,首先将索引设置为 0,第二个将其设置为 1。我们这样做是因为工作区在特定的可用区域中可用。到目前为止,我们正在部署的 3 个区域在索引 0 和 1 的可用区中都有可用的工作区。

但现在我们要添加另一个可用区,其工作区在 1 和 2 索引处可用。

我有一个 PoC,可以!Equals在该特定区域的条件下使用,但随后它将为该可用区设置一个额外的子网、路由表等整个网络设置。这并不理想。BTW 我的!Equals情况如下:

    WorkspaceSubnet: !Equals
    - !Ref 'AWS::Region'
    - 'us-east-1'

我想要的是可以在!Equals条件为真/假的基础上设置索引的东西,如下所示:

  PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: !Ref 'PrivateSubnetCIDR1'
      AvailabilityZone: !if
        - WorkspaceSubnet
        - !Select 
          - '2'
          - !GetAZs ''
        - !Select 
          - '0'
          - !GetAZs ''
      Tags:
        - Key: Name
          Value: Private-Subnet-1
      VpcId: !Ref 'VPC'

但这给了我错误:[cfn-lint] E3002: Property Resources/PrivateSubnet1/Properties/AvailabilityZone has an illegal function Fn::if

标签: amazon-web-servicesnetworkingamazon-cloudformationamazon-vpcsubnet

解决方案


有时我们会犯一些肉眼无法发现的愚蠢错误,当您将其发布到 StackOverflow 上时,您的一些同行会开始审查,而有些人会非常关心以深入挖掘。

感谢我的学员Mehdi Azhar指出这只是一个小写问题。内在功能!if以大写字母开头!If

所以正确的代码应该是:

  PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      CidrBlock: !Ref 'PrivateSubnetCIDR1'
      AvailabilityZone: !If
        - WorkspaceSubnet
        - !Select 
          - '2'
          - !GetAZs ''
        - !Select 
          - '0'
          - !GetAZs ''
      Tags:
        - Key: Name
          Value: Private-Subnet-1
      VpcId: !Ref 'VPC'


推荐阅读