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块?
答案 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::Split
(00::/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]]