AWS CDK中ec2.Vpc如何使用IPAM池分配CIDR地址块
解决方案
你不需要重写所有依赖ec2.Vpc的资源,直接通过CDK L2构造的底层转义能力修改配置即可,全程不改动上层VPC实例的引用,所有关联的VPN端点、NAT网关、子网资源都能正常复用。
第一步:先修正现有IPAM配置的错误
你当前的IPAM配置有两处问题:
- 区域级IPAM池的
source_ipam_pool_id参数配置错误,顶级池本身没有上层源池,需要引用顶级池的实际资源ID完成嵌套 - 顶级池配置的
locale="None"是无效值,locale需要传入合法AWS区域名,全局级顶级池不需要配置该参数 - 手动创建的
cfn_iPAMAllocation资源多余,VPC创建时会自动向关联IPAM池申请CIDR,提前手动申请会白白占用地址段
修正后的IPAM相关代码如下:
cfn_iPAM = ec2.CfnIPAM(self, "MyCfnIPAM", description="description", operating_regions=[ec2.CfnIPAM.IpamOperatingRegionProperty(region_name=self.region)] ) # 顶级IPAM地址池 cfn_Top_IpamPool = ec2.CfnIPAMPool(self, "TOP-CfnIPAMPool", address_family="ipv4", ipam_scope_id=cfn_iPAM.attr_private_default_scope_id, auto_import=False, description="top-level-pool", provisioned_cidrs=[ec2.CfnIPAMPool.ProvisionedCidrProperty( cidr=cidr_range )], publicly_advertisable=False, ) # 区域级IPAM地址池 cfn_Region_iPAMPool = ec2.CfnIPAMPool(self, "Local-CfnIPAMPool", address_family="ipv4", ipam_scope_id=cfn_iPAM.attr_private_default_scope_id, auto_import=False, description="region-level-pool", locale=self.region, provisioned_cidrs=[ec2.CfnIPAMPool.ProvisionedCidrProperty( cidr=region_cidr_range )], publicly_advertisable=False, source_ipam_pool_id=cfn_Top_IpamPool.attr_ipam_pool_id, )
第二步:调整VPC创建逻辑,注入IPAM配置
- 删除
ec2.Vpc构造中硬编码的cidr = '10.0.0.0/16'参数,IPAM分配模式下静态CIDR参数和IPAM参数互斥,同时配置会触发CloudFormation报错。 - 创建完L2 VPC实例后,通过
node.default_child拿到底层对应的L1CfnVpc实例,直接给它配置IPAM池ID和需要分配的VPC网段掩码长度即可。
修正后的VPC代码如下:
self.vpc = ec2.Vpc(self, 'VPN', max_azs = 1, enable_dns_hostnames = True, enable_dns_support = True, subnet_configuration=[ ec2.SubnetConfiguration( name = 'Public-Subnet', subnet_type = ec2.SubnetType.PUBLIC, cidr_mask = 20, ), ec2.SubnetConfiguration( name = 'Private-Subnet', subnet_type = ec2.SubnetType.PRIVATE_WITH_NAT, cidr_mask = 20 ) ], nat_gateways = 1, nat_gateway_subnets=ec2.SubnetSelection(subnet_group_name="Public-Subnet"), nat_gateway_provider=ec2.NatProvider.gateway(eip_allocation_ids=[elastic_ip_id]), ) # 拿到底层L1 CfnVpc实例,注入IPAM配置 cfn_vpc = self.vpc.node.default_child # 关联区域级IPAM池 cfn_vpc.ipv4_ipam_pool_id = cfn_Region_iPAMPool.attr_ipam_pool_id # 配置VPC要分配的掩码长度,和原计划的/16网段保持一致 cfn_vpc.ipv4_netmask_length = 16
注意事项
- 所有依赖
self.vpc的资源不需要做任何修改,CDK会自动处理依赖链:IPAM池创建完成后才会创建VPC,VPC拿到IPAM分配的CIDR后,L2构造会自动按你配置的子网规则划分公网、私网网段,和你之前用静态CIDR的效果完全一致。 - 确保IPAM池预置的CIDR段足够容纳你要分配的/16 VPC网段,你当前配置的两个/20子网总占用/19地址空间,/16的VPC网段完全满足需求。
- 该方法不依赖特定CDK版本,所有CDK v2版本都支持通过
node.default_child访问底层L1构造。
内容的提问来源于stack exchange,提问作者Hicham Fellah
相关产品推荐
相关产品推荐

