通过CloudFormation创建VPC的子网问题

时间:2019-02-11 07:20:14

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

我是网络领域的菜鸟。我正在通过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地区。 我在这里做错什么了吗?

2 个答案:

答案 0 :(得分: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个元素),但该元素不存在,这就是为什么您看到该错误消息的原因。

您可能需要在移动到其他区域,拥有不同数量的子网或具有一个具有2个子网的可用区和其余的具有1个子网的位置之间进行选择。

答案 1 :(得分:0)

万一您想知道为什么在为可用区更新正确的索引后我的堆栈仍然失败,请注意。

根据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": []
    }
}

干杯!