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

使用AWS CDK为私有子网添加NAT实例路由失败的解决方法

AWS CDK中为私有子网添加NAT实例路由失败的解决方法

问题概述

已创建VPC,尝试通过AWS CDK将私有子网的默认路由(0.0.0.0/0)指向自定义创建的NAT实例,但执行cdk deploy后,私有子网的路由表并未添加该路由。即使手动添加依赖配置,问题仍未解决。

原因分析

你的代码存在两处关键问题导致路由无法正确创建:

  1. 依赖引用错误:route.addDependsOn(natInstance.instance)中的natInstance.instance并非正确的CloudFormation底层资源引用。ec2.Instance是CDK的L2构造,其对应的CloudFormation AWS::EC2::Instance资源需要通过node.defaultChild获取。
  2. EIP资源管理不规范:在CfnEIPAssociation中内联创建CfnEIP会导致资源依赖关系混乱,EIP的创建与实例关联的顺序无法得到保障。

解决方案

1. 修正依赖引用

将路由对NAT实例的依赖改为引用L2构造的底层CFN资源。

2. 单独创建EIP资源

先独立创建CfnEIP,再进行关联,明确资源间的依赖顺序。

3. 确保NAT实例安全组配置正确

安全组需要允许私有子网的流量访问NAT实例(比如放行私有子网CIDR段的入站TCP/UDP流量,以及所有出站流量),否则即使路由添加成功,私有子网也无法通过NAT实例访问公网。

修正后的代码

// NAT实例安全组(确保已配置正确规则)
const natSG = new ec2.SecurityGroup(this, 'nat-sg', {
  vpc,
  allowAllOutbound: true,
});
// 允许私有子网的流量访问NAT实例
natSG.addIngressRule(ec2.Peer.ipv4(vpc.vpcCidrBlock), ec2.Port.allTraffic());

// NAT instance
const natInstance = new ec2.Instance(this, "nat-instance", {
    vpc,
    vpcSubnets: { subnetType: ec2.SubnetType.PUBLIC },
    instanceType: new ec2.InstanceType("t3.micro"),
    machineImage: new ec2.NatInstanceImage(),
    securityGroup: natSG,
    keyName: "seungho-key-pair",
    sourceDestCheck: false,
});

// 单独创建Elastic IP
const natEip = new ec2.CfnEIP(this, "Nat EIP", {});

// Attach Elastic IP to NAT instance
const eIPAssociation = new ec2.CfnEIPAssociation(
    this,
    "Nat EIP Association",
    {
        instanceId: natInstance.instanceId,
        eip: natEip.ref,
    }
);

// Update Private Subnet Route Table
vpc.privateSubnets.forEach((subnet, index) => {
    const route = new ec2.CfnRoute(this, `NAT ROUTE${index + 1}`, {
        routeTableId: subnet.routeTable.routeTableId,
        destinationCidrBlock: "0.0.0.0/0",
        instanceId: natInstance.instanceId,
    });
    // 修正依赖:引用NAT实例的底层CFN资源
    route.addDependsOn(natInstance.node.defaultChild as ec2.CfnInstance);
    route.addDependsOn(eIPAssociation);
});

额外检查

  • 确认VPC的私有子网未被CDK自动配置NAT网关:如果你的VPC是通过CDK创建时指定了natGateways参数,那么私有子网会自动生成指向NAT网关的默认路由,此时需要先移除该路由再添加指向NAT实例的路由。
  • 执行cdk diff查看部署变更:通过cdk diff可以预览CloudFormation将要执行的变更,确认路由资源是否被正确定义。

内容的提问来源于stack exchange,提问作者Seungho Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:33:12