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

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

问题描述:

AWS为VPC生成ipv6 CIDR块,因此无法提前确定。生成的CIDR块如下所示:2a05:d018:84c:c500::/56并始终为56.如何在VPC上创建子网时确定AWS Cloudformation中的ipv6 CIDR块前缀

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

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

我见过使用lambda函数的解决方案,但这会使模板非常复杂。我想使用模板中提供的内置内部函数来完成此操作。

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

下面就来计算YAML第一个子网的方式:

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

这是一个非常清晰的解决方案。谢谢! –

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

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

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