You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:公有子网,默认路由指向互联网网关,实例可分配公网IP
  • SubnetType.PRIVATE_WITH_EGRESS:原私有子网类型的替代值,默认路由指向NAT网关,可主动访问公网但无法被公网直接访问
  • SubnetType.PRIVATE_ISOLATED:完全隔离子网,无公网路由,仅允许VPC内部资源访问

内容的提问来源于stack exchange,提问作者Mahesh Manjunath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:06:20