使用 cloudformation 为每个可用区创建子网

Creating subnet per availability zone using cloudformation

我需要使用 cloudformation 在特定区域为每个可用区创建子网。

例如,如果区域是 孟买,它具有三个可用区,CF 模板应在每个可用区中创建一个 public 和一个私有子网: 1a1b1c。真的可能吗?我使用 terraform 做了同样的事情,但不知道如何在 CF 中实现这一点。

如果有人能在这方面提供帮助,那就太好了。

提前致谢。

遗憾的是,普通 CloudFormation 中没有循环。因此,您不能创建任何会遍历 AZ 的构造,获取它们的 ID 并在每个 AZ 中创建一对私有-public 子网。

如果您真的想将所有内容都保留在 CloudFormation 中,则必须查看 custom resources or marcros

它们都需要您编写自己的 lambda 函数,该函数将使用 AWS API 获取 AZ 的数量、它们的名称并执行迭代来创建子网。

如果您已经成功地使用了 terraform,也许值得考虑继续使用它,因为它的循环在您的用例中很有用。

你或许可以写在cloudformation中。例如,使用 Fn::If 然后使用 Fn::GetAZs 并仅当足够的 azs 参数可以硬编码时才创建资源。

  PrivateSubnet6:
    Condition: Has6AZs
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: MyVPC
      CidrBlock: 10.0.20.0/22 
      AvailabilityZone:
        Fn::Select: 
        - 5
        - Fn::GetAZs: !Ref 'AWS::Region'
      Tags:
        - Key: "Name"
          Value: "PrivateSubnet6"  

  Has6AZs:
    Fn::Equals: [!Ref AWS::Region, "us-east-1"]