使用AWS CDK创建VPC子网遇CIDR冲突问题求助
问题根源
你创建ec2.Vpc实例时,CDK默认会自动生成子网(默认配置是每个可用区创建1个公网子网和1个私网子网),这些自动生成的子网会占用你VPC CIDR范围内的地址段,和你手动指定的子网CIDR产生重叠,这就是报错的原因。
解决方案
有两种方式可以解决这个问题:
方式1:禁用VPC自动子网创建,手动管理所有子网
创建VPC时,通过subnetConfiguration设置为空数组,关闭自动子网生成,然后再手动创建你需要的子网:
const vpc = new ec2.Vpc(this, name, { ipAddresses: IpAddresses.cidr('12.0.0.0/23'), subnetConfiguration: [] // 禁用自动子网创建 }); // 手动创建公网子网,开启自动分配公网IP const publicOneSubnet = new ec2.Subnet(this, 'PublicOneSubnet', { availabilityZone: 'eu-west-1a', vpcId: vpc.vpcId, cidrBlock: '12.0.0.0/25', mapPublicIpOnLaunch: true }) // 创建互联网网关并关联到VPC const igw = new ec2.CfnInternetGateway(this, 'Igw'); new ec2.CfnVPCGatewayAttachment(this, 'IgwAttachment', { vpcId: vpc.vpcId, internetGatewayId: igw.ref }); // 给公网子网添加默认路由到互联网网关 new ec2.CfnRoute(this, 'PublicOneDefaultRoute', { routeTableId: publicOneSubnet.routeTable.routeTableId, destinationCidrBlock: '0.0.0.0/0', gatewayId: igw.ref }); const publicTwoSubnet = new ec2.Subnet(this, 'PublicTwoSubnet', { availabilityZone: 'eu-west-1b', vpcId: vpc.vpcId, cidrBlock: '12.0.0.128/25', mapPublicIpOnLaunch: true }) // 给第二个公网子网添加默认路由 new ec2.CfnRoute(this, 'PublicTwoDefaultRoute', { routeTableId: publicTwoSubnet.routeTable.routeTableId, destinationCidrBlock: '0.0.0.0/0', gatewayId: igw.ref }); // 手动创建私网子网 const privateOneSubnet = new ec2.Subnet(this, 'PrivateOneSubnet', { availabilityZone: 'eu-west-1a', vpcId: vpc.vpcId, cidrBlock: '12.0.1.0/25' }) const privateTwoSubnet = new ec2.Subnet(this, 'PrivateTwoSubnet', { availabilityZone: 'eu-west-1b', vpcId: vpc.vpcId, cidrBlock: '12.0.1.128/25' })
方式2:通过CDK的subnetConfiguration定义子网(推荐)
这种方式不需要手动创建ec2.Subnet,让CDK帮你管理子网的CIDR分配,避免冲突,同时自动配置路由表、互联网网关等资源:
const vpc = new ec2.Vpc(this, name, { ipAddresses: IpAddresses.cidr('12.0.0.0/23'), availabilityZones: ['eu-west-1a', 'eu-west-1b'], // 指定目标可用区 subnetConfiguration: [ { name: 'PublicSubnet', subnetType: ec2.SubnetType.PUBLIC, cidrMask: 25 // 每个公网子网分配/25的CIDR段 }, { name: 'PrivateSubnet', subnetType: ec2.SubnetType.PRIVATE_ISOLATED, // 若需访问互联网,改用PRIVATE_WITH_EGRESS并自动配置NAT网关 cidrMask: 25 } ] });
如果你需要私网子网访问互联网,把
subnetType改成ec2.SubnetType.PRIVATE_WITH_EGRESS,CDK会自动创建NAT网关并配置对应路由。
补充说明
你之前的IP段划分逻辑是正确的:12.0.0.0/23确实覆盖12.0.0.0-12.0.1.255,每个/25子网的地址段也没有重叠,问题完全出在CDK默认自动生成的子网和你手动创建的子网冲突。
内容的提问来源于stack exchange,提问作者Neville Bamshoot
相关产品推荐
相关产品推荐

