如何在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]]]
答
您可以使用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"
]
]
}
这是一个非常清晰的解决方案。谢谢! –