AWS CDK Python部署报错:达最大地址数 无法创建NAT网关
问题根因分析
- 报错
The maximum number of addresses has been reached核心诱因有两个:一是你在VPC初始化参数中已经设置nat_gateways=1,CDK会自动为NAT网关申请弹性公网IP(EIP),同时你又编写了手动创建NAT网关的逻辑,重复申请EIP很容易打满AWS单区域默认的EIP配额;二是之前部署失败残留的未释放闲置EIP也会占用配额。另外你手动编写的attach_nat_gateway方法中所有参数都是占位字符串,没有传入实际资源引用,本身就无法正常运行。 - 子网配置逻辑错误:VPC初始化的
subnet_configuration中,你把私有子网的类型也设置为SubnetType.PUBLIC,实际创建出来的是两个公有子网,不存在预期的私有子网,自然无法完成NAT网关挂载到私有子网的操作。 - 废弃API误解:
SubnetType.PRIVATE确实已在新版CDK中被标记废弃,但官方已经提供了明确的替代枚举值,不存在无法创建私有子网的问题。
解决步骤
1. 修正VPC与子网配置,替换废弃API
直接使用CDK的Vpc高级构造时,只要配置正确的子网类型,CDK会自动完成NAT网关创建、EIP分配、私有子网路由表关联的全流程,不需要手动编写低级Cfn资源。其中原SubnetType.PRIVATE的替代值为SubnetType.PRIVATE_WITH_EGRESS,代表可通过NAT网关主动访问公网的私有子网。
正确的VPC初始化代码如下:
from aws_cdk import aws_ec2 as ec2 from constructs import Construct def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) self.bifrost_vpc = ec2.Vpc( self, 'custom-VPC', cidr='10.0.0.0/16', nat_gateways=1, # 自动在第一个公有子网创建1个NAT网关 subnet_configuration=[ ec2.SubnetConfiguration( name="public", subnet_type=ec2.SubnetType.PUBLIC, cidr_mask=24 ), ec2.SubnetConfiguration( name="private", subnet_type=ec2.SubnetType.PRIVATE_WITH_EGRESS, # 替换废弃的PRIVATE类型 cidr_mask=24 ) ], enable_dns_support=True, enable_dns_hostnames=True, )
2. 清理无效代码与闲置资源
- 直接删除你之前编写的无效
attach_nat_gateway方法,使用上述VPC配置时CDK会自动完成所有NAT相关配置,避免重复创建资源触发EIP配额报错。 - 登录AWS EC2控制台,进入弹性IP板块,释放所有未绑定任何资源的闲置EIP,释放被占用的配额。
3. 自定义NAT网关场景的正确写法(可选)
如果需要自定义NAT网关配置(比如绑定固定的EIP),先把VPC初始化参数中的nat_gateways设为0,关闭CDK自动创建NAT的逻辑,再手动编写资源创建代码,注意所有参数必须引用实际创建的资源属性,不能使用硬编码占位符:
def attach_nat_gateway(self): # 先创建绑定VPC的弹性EIP elastic_ip = ec2.CfnEIP( self, "NatEIP", domain="vpc" ) # 引用公有子网实际ID、EIP实际分配ID创建NAT网关 cfn_nat_gateway = ec2.CfnNatGateway( self, "MyCfnNatGateway", subnet_id=self.bifrost_vpc.public_subnets[0].subnet_id, allocation_id=elastic_ip.attr_allocation_id, connectivity_type="public" ) # 为私有子网路由表添加默认路由,指向NAT网关 for private_subnet in self.bifrost_vpc.private_subnets: ec2.CfnRoute( self, f"PrivateNatRoute_{private_subnet.availability_zone}", route_table_id=private_subnet.route_table.route_table_id, destination_cidr_block="0.0.0.0/0", nat_gateway_id=cfn_nat_gateway.ref ) return cfn_nat_gateway
附:CDK SubnetType枚举说明
SubnetType.PUBLIC:公有子网,默认路由指向互联网网关,实例可分配公网IPSubnetType.PRIVATE_WITH_EGRESS:原私有子网类型的替代值,默认路由指向NAT网关,可主动访问公网但无法被公网直接访问SubnetType.PRIVATE_ISOLATED:完全隔离子网,无公网路由,仅允许VPC内部资源访问
内容的提问来源于stack exchange,提问作者Mahesh Manjunath
相关产品推荐
相关产品推荐

