在VPC上创建子网时,如何在AWS Cloudformation中确定ipv6 CIDR块前缀

时间:2017-10-04 18:02:55

标签: amazon-cloudformation

AWS为VPC生成ipv6 CIDR块,因此无法提前确定。生成的CIDR块看起来像:2a05:d018:84c:c500::/56,总是大小为56。

创建子网时,必须使用完整的前缀值指定64块大小。例如。 2a05:d018:84c:c501::/64

可以在cloudformation中查找vPC的ipv6 CIDR块,但这会返回完整值,而不仅仅是前缀。要创建子网,我们需要能够在前缀中添加01::/64内容,以便为子网创建64位大小的块。

我见过使用lambda函数的解决方案,但这会使模板变得非常复杂。我只想使用模板中提供的内置函数来实现这一点。

在同一堆栈中部署带有ipv6子网的VPC时,如何为子网生成有效的ipv6 CIDR块?

4 个答案:

答案 0 :(得分:5)

这是一个使用Fn::Cidr intrinsic function执行相同操作的衬垫。

!Select [1, !Cidr [!Select [0, !GetAtt 'Vpc.Ipv6CidrBlocks'], 256, 64]]

对于给定的块2a05:d018:84c:c500::/56,这将为您提供2a05:d018:84c:c501::/64

增加第一个索引以获得下一个块。

!Select [2, !Cidr [!Select [0, !GetAtt 'Vpc.Ipv6CidrBlocks'], 256, 64]]

会给你2a05:d018:84c:c502::/64

此处还有一个完整的最小示例,包括使用AWS::EC2::VPCCidrBlock资源将IPv6块附加到VPC并使用DependsOn属性确保VPCCidrBlock在之前附加的关键步骤子网已创建。

Resources:
  Vpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Sub '10.255.0.0/16'

  VpcCidrBlockIpv6:
    Type: 'AWS::EC2::VPCCidrBlock'
    Properties:
      VpcId: !Ref 'Vpc'
      AmazonProvidedIpv6CidrBlock: true

  PrivateSubnet:
    Type: AWS::EC2::Subnet
    DependsOn: VpcCidrBlockIpv6 # Wait for IPv6 CIDR to be attached to VPC before creating subnet
    Properties:
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      VpcId: !Ref 'Vpc'
      AssignIpv6AddressOnCreation: true
      CidrBlock: !Sub '10.255.0.0/20'
      Ipv6CidrBlock: !Select [1, !Cidr [!Select [0, !GetAtt 'Vpc.Ipv6CidrBlocks'], 256, 64]]

答案 1 :(得分:3)

这是计算YAML中第一个子网的方法:

Fn::Sub:
    - "${VpcPart}${SubnetPart}"
    - SubnetPart: 01::/64
      VpcPart: !Select [0, !Split ['00::/56', !Select [0,!GetAtt YourVpc.Ipv6CidrBlocks]]]

答案 2 :(得分:1)

您可以使用Fn::Split00::/56)和Fn::Select的组合来确定前缀,以获取前缀。然后,您可以使用Fn::Join附加自己的值来创建子网CIDR块。以下示例假定您有一个带有一个或多个与之关联的Ipv6 CIDR块的VPC。

将此值用于子网上的Ipv6CidrBlock属性。

{
    "Fn::Join": [
        "",
        [
            {
                "Fn::Select": [
                    0,
                    {
                        "Fn::Split": [
                            "00::/56",
                            {
                                "Fn::Select": [
                                    0,
                                    {
                                        "Fn::GetAtt": [
                                            "Vpc",
                                            "Ipv6CidrBlocks"
                                        ]
                                    }
                                ]
                            }
                        ]
                    }
                ]
            },
            "01::/64"
        ]
    ]
}

答案 3 :(得分:1)

AWS VPC服务允许我们创建VPC并关联Amazon提供的/ 56 IPv6 CIDR块[我们无法提供自己的CIDR]。 每个子网的IP块可以为/ 64。这意味着理论上可以有2 ^(64-56)个子网,即2 ^ 8 = 256个子网。

为计算IPv6 CIDR块的子网,Cloudformation提供了一个固有函数!Cidr来帮助我们做到这一点。

CIDR块的语法如下:

!Cidr [ ipBlock, count, cidrBits ]

其中

计数->要生成的CIDR数。有效范围是1到256。

cidrBits -> CIDR的子网位数。例如,为此参数指定值“ 8”将创建一个掩码为“ / 24”的CIDR。

所以我们的陈述变成:

!Select [0, !Cidr [!Select [0, !GetAtt 'Vpc.Ipv6CidrBlocks'], 256, 64]]

因此,用于创建具有2个子网的VPC的示例模板如下所示:

AWSTemplateFormatVersion: "2010-09-09"
    Resources:
        Vpc:
            Type: AWS::EC2::VPC
            Properties:
                CidrBlock: !Sub '10.255.0.0/16'

        VpcCidrBlockIpv6:
            Type: 'AWS::EC2::VPCCidrBlock'
            Properties:
                VpcId: !Ref 'Vpc'
                AmazonProvidedIpv6CidrBlock: true

        Subnet1:
            Type: AWS::EC2::Subnet
            Properties:
                AvailabilityZone: !Select [ 0, !GetAZs '' ]
                VpcId: !Ref 'Vpc'
                AssignIpv6AddressOnCreation: true
                CidrBlock: !Sub '${PrivateSubnetCIDR1}'
                Ipv6CidrBlock: !Select [0, !Cidr [!Select [0, !GetAtt 'Vpc.Ipv6CidrBlocks'], 256, 64]]

        Subnet2:
            Type: AWS::EC2::Subnet
            Properties:
                VpcId: !Ref 'Vpc'
                AssignIpv6AddressOnCreation: true
                CidrBlock: !Sub '${PrivateSubnetCIDR2}'
                Ipv6CidrBlock: !Select [1, !Cidr [!Select [0, !GetAtt 'Vpc.Ipv6CidrBlocks'], 256, 64]]