【问题标题】:Subnet problem in VPC creation via cloudformation通过 cloudformation 创建 VPC 中的子网问题
【发布时间】:2019-07-04 15:45:16
【问题描述】:

我是网络新手。我正在通过 Cloudformation 创建一个 VPC。在那,我必须创建 4 个子网。当我运行包含的模板时,我看到了这个错误: 模板错误:Fn::Select 无法选择索引 3 处不存在的值

但是,当我用 3 个子网创建它时,就可以了。

我的模板示例:

Parameters:

  VpcBlock:
    Type: String
    Default: 192.168.0.0/16
    Description: The CIDR range for the VPC. This should be a valid private (RFC 1918) CIDR range.

  Subnet01Block:
    Type: String
    Default: 192.168.0.0/14
    Description: CidrBlock for subnet 01 within the VPC

  Subnet02Block:
    Type: String
    Default: 192.168.64.0/14
    Description: CidrBlock for subnet 02 within the VPC

  Subnet03Block:
    Type: String
    Default: 192.168.128.0/14
    Description: CidrBlock for subnet 03 within the VPC

  Subnet04Block:
    Type: String
    Default: 192.168.192.0/14
    Description: CidrBlock for subnet 04 within the VPC

Resources:
  Subnet01:
    Type: AWS::EC2::Subnet
    Metadata:
      Comment: Subnet 01
    Properties:
      AvailabilityZone:
        Fn::Select:
        - '0'
        - Fn::GetAZs:
            Ref: AWS::Region
      CidrBlock:
        Ref: Subnet01Block
      VpcId:
        Ref: VPC
      Tags:
      - Key: Name
        Value: !Sub "${AWS::StackName}-Services-Subnet01"

  Subnet02:
    Type: AWS::EC2::Subnet
    Metadata:
      Comment: Subnet 02
    Properties:
      AvailabilityZone:
        Fn::Select:
        - '1'
        - Fn::GetAZs:
            Ref: AWS::Region
      CidrBlock:
        Ref: Subnet02Block
      VpcId:
        Ref: VPC
      Tags:
      - Key: Name
        Value: !Sub "${AWS::StackName}-Services-Subnet02"

  Subnet03:
    Type: AWS::EC2::Subnet
    Metadata:
      Comment: Subnet 03
    Properties:
      AvailabilityZone:
        Fn::Select:
        - '2'
        - Fn::GetAZs:
            Ref: AWS::Region
      CidrBlock:
        Ref: Subnet03Block
      VpcId:
        Ref: VPC
      Tags:
      - Key: Name
        Value: !Sub "${AWS::StackName}-Services-Subnet03"

  Subnet04:
    Type: AWS::EC2::Subnet
    Metadata:
      Comment: Subnet 04
    Properties:
      AvailabilityZone:
        Fn::Select:
        - '3'
        - Fn::GetAZs:
            Ref: AWS::Region
      CidrBlock:
        Ref: Subnet04Block
      VpcId:
        Ref: VPC
      Tags:
      - Key: Name
        Value: !Sub "${AWS::StackName}-Services-Subnet04"

我正在 us-west-2 区域部署此模板。 我在这里做错了吗?

【问题讨论】:

  • 为什么要创建 4 个子网?

标签: amazon-web-services networking amazon-cloudformation amazon-vpc


【解决方案1】:

您的问题是 AWS 中的不同区域具有不同数量的可用区 (AZ) (docs)。

由于您位于区域 us-west-2,因此您只有 3 个可用区。其他地区,如us-east-1,有更多。可以使用以下方式找到您所在地区的可用区:

▶ aws ec2 describe-availability-zones --region us-west-2 --query 'AvailabilityZones[].ZoneName' 
[
    "us-west-2a", 
    "us-west-2b", 
    "us-west-2c"
]

同时,内部函数 Fn::GetAZs 将 AZ 作为数组返回给您。您引用了该数组的第 3 个元素(即第 4 个)并且它不存在,这就是您看到该错误消息的原因。

您可能需要选择移动到不同的区域、拥有不同数量的子网,或者一个 AZ 有 2 个子网,其余的有 1 个。

【讨论】:

  • 谢谢@Alex。那你能给我一个建议吗?如果我想通过 us-west-2 区域的 cloudformation 在 VPC 中创建 6 个子网。如果要求的可用区不存在,如何创建?
  • 因此您只需在每个子网中放置 2 个子网。在 192.168.0.0/19、192.168.32.0/19 等处启动子网,然后 Fn::Select 0、Fn::Select 1、Fn::Select 2,然后重复 Fn::Select 0、Fn::Select 1、Fn::再次选择2。有意义吗?
  • 谢谢,@Alex。它帮助我理解了问题。
【解决方案2】:

如果你们中的任何人想知道,为什么我的堆栈在更新可用区的正确索引后仍然失败,有一个警告。

根据Fn::GetAZs 的文档,

对于 EC2-Classic 平台,Fn::GetAZs 函数返回所有 区域的可用区。对于 EC2-VPC 平台, Fn::GetAZs 函数仅返回具有 默认子网,除非所有可用区都没有默认子网 子网;在这种情况下,将返回所有可用区。

如果您在特定的可用区域中没有默认子网,请按如下方式创建一个。

─($:~/anraj)─- aws ec2 create-default-subnet --availability-zone us-west-2c
{
    "Subnet": {
        "AvailabilityZone": "us-west-2c",
        "AvailableIpAddressCount": 4091,
        "CidrBlock": "172.31.32.0/20",
        "DefaultForAz": true,
        "MapPublicIpOnLaunch": true,
        "State": "available",
        "SubnetId": "subnet-xxxxxxxxxx",
        "VpcId": "vpc-xxxxxxx",
        "OwnerId": "xxxxxxxxx",
        "AssignIpv6AddressOnCreation": false,
        "Ipv6CidrBlockAssociationSet": [],
        "Tags": []
    }
}

干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2021-03-14
    • 2016-05-12
    • 2020-02-17
    • 2019-07-16
    • 2018-02-05
    • 1970-01-01
    相关资源
    最近更新 更多