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

Eri*_*ric 4 aws-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块?

tal*_*ech 9

这是一个使用Fn :: Cidr内部函数执行相同操作的衬里.

!Select [1, !Cidr [!Select [0, !GetAtt 'Vpc.Ipv6CidrBlocks'], 256, 64]]
Run Code Online (Sandbox Code Playgroud)

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

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

!Select [2, !Cidr [!Select [0, !GetAtt 'Vpc.Ipv6CidrBlocks'], 256, 64]]
Run Code Online (Sandbox Code Playgroud)

会给你 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]]
Run Code Online (Sandbox Code Playgroud)