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

使用AWS CDK配置NAT网关路由时遇InvalidInstanceID.Malformed错误

问题:AWS CDK配置NAT网关路由时出现InvalidInstanceID.Malformed错误

尝试使用AWS CDK(JavaScript)创建CloudFormation栈,计划在公网子网中创建NAT网关,并为私有子网路由表配置指向该NAT网关的默认路由,部署时触发以下错误:

Invalid id: "nat-0cfe60af88b3df93a" (Service: AmazonEC2; Status Code: 400; Error Code: InvalidInstanceID.Malformed; Request ID: 4ecbe914-6ead-4d05-bf8c-d87cd0c72654; Proxy: null)

相关代码片段

VPC、公网子网与NAT网关创建代码(执行正常)

// CREATE VPC & SUBNET
const vpc = new ec2.CfnVPC(this, `${applicationName}-vpc`, {
  cidrBlock: '10.1.0.0/16',
})

const publicSubnet1 = new ec2.PublicSubnet(this, `${applicationName}-public1`, {
  availabilityZone: availabilityZone1,
  cidrBlock: '10.1.0.0/20',
  vpcId: vpc.attrVpcId,
  mapPublicIpOnLaunch: true
})

// CREATE NAT GATEWAY
const webserverNatGatewayEIP = new ec2.CfnEIP(this, `${applicationName}-webserver-natgwEIP`)

const webserverNatGateway = new ec2.CfnNatGateway(this, `${applicationName}-webserver-natgw`, {
  subnetId: publicSubnet1.subnetId,
  allocationId: webserverNatGatewayEIP.attrAllocationId,
  tags: [{
    key: 'Name',
    value: `${applicationName}-webserver-natgw`
  }]
})

路由表与路由配置代码(触发错误)

// CREATE PRIVATE ROUTE TABLE
const webserverRouteTable = new ec2.CfnRouteTable(this, `${applicationName}-webserver-rtb`, {
  vpcId: vpc.attrVpcId
})

// not working, need to debug
const webserverRouteTableNatGWRoute = new ec2.CfnRoute(this, 'webserver-rt-natgw-route', {
  routeTableId: webserverRouteTable.attrRouteTableId,
  destinationCidrBlock: '0.0.0.0/0',
  instanceId: webserverNatGateway.attrNatGatewayId
})

已尝试添加依赖关系webserverRouteTableNatGWRoute.addDependency(webserverNatGateway),但问题未解决,且已确认NAT网关ID在控制台中显示正确。


问题原因与解决方案

核心问题

错误的根源是在CfnRoute中错误使用了instanceId参数来指定NAT网关。instanceId参数仅用于将路由指向EC2实例(比如作为网关的EC2),而指向NAT网关需要使用专门的natGatewayId参数。AWS EC2服务收到nat-开头的ID时,会判定这不是合法的实例ID,因此抛出InvalidInstanceID.Malformed错误。

修正后的路由配置代码

// CREATE PRIVATE ROUTE TABLE
const webserverRouteTable = new ec2.CfnRouteTable(this, `${applicationName}-webserver-rtb`, {
  vpcId: vpc.attrVpcId
})

// 修正:使用natGatewayId替代instanceId
const webserverRouteTableNatGWRoute = new ec2.CfnRoute(this, 'webserver-rt-natgw-route', {
  routeTableId: webserverRouteTable.attrRouteTableId,
  destinationCidrBlock: '0.0.0.0/0',
  natGatewayId: webserverNatGateway.attrNatGatewayId
})

额外说明

  • 无需手动添加依赖关系,CDK会自动识别natGatewayId引用了webserverNatGateway的属性,自动在CloudFormation中生成依赖关系,确保NAT网关先于路由创建。
  • 如果后续需要将路由表关联到私有子网,可使用ec2.CfnSubnetRouteTableAssociation完成关联。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:37:17