使用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
相关产品推荐
相关产品推荐

