英文:
Why am I seeing InvalidInstanceID.Malformed in my NAT Gateway's Route?
问题
以下是您要翻译的内容:
我正在尝试使用AWS CDK(在Javascript中)创建一个堆栈。在我的堆栈中,我想在公共子网中创建一个NAT网关,该子网由我的私有子网中的路由表引用。非常标准的操作。
以下是我用于创建这个基础设施的相关代码片段:
// 创建VPC和子网
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
})
// 创建NAT网关
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
}]
})
这很好。但是,当我尝试创建我的路由表和如下所示的路由到NAT网关时:
// 创建私有路由表
const webserverRouteTable = new ec2.CfnRouteTable(this, ${applicationName}-webserver-rtb
, {
vpcId: vpc.attrVpcId
})
// 不起作用,需要调试
const webserverRouteTableNatGWRoute = new ec2.CfnRoute(this, 'webserver-rt-natgw-route', {
routeTableId: webserverRouteTable.attrRouteTableId,
destinationCidrBlock: '0.0.0.0/0',
instanceId: webserverNatGateway.attrNatGatewayId
})
当我尝试部署我的堆栈时,我看到以下错误消息:
无效的ID:“nat-0cfe60af88b3df93a”(服务:AmazonEC2;状态代码:400;错误代码:InvalidInstanceID.Malformed;请求
ID:4ecbe914-6ead-4d05-bf8c-d87cd0c72654;代理:null)
我不明白为什么对instanceId的.attrXYZ
调用可能会格式错误。我在我的基础设施的其他地方都使用了类似的参数,一直运行得很好。
我手动检查了AWS控制台,以查看NAT网关ID是否不正确,但它完全匹配。我不明白为什么会出现此错误。我猜想也许NAT网关没有及时创建,所以我通过
webserverRouteTableNatGWRoute.addDependency(webserverNatGateway)
但是那并没有解决问题。有什么建议吗?
英文:
I am trying to create a Stack using AWS CDK (in Javascript). In my stack, I would like to create a NAT gateway in a public subnet that is referenced by Route Table in my private subnet. Pretty standard stuff.
Below is a snippet of the relevant code I have to create the infra for this
// 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`
}]
})
This is fine. However, when I try to create my route table and a route to that NAT gateway as follows:
// 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
})
I am seeing the following error message when I try to deploy my stack.
Invalid id: "nat-0cfe60af88b3df93a" (Service: AmazonEC2; Status Code: 400; Error Code: InvalidInstanceID.Malformed; Request
ID: 4ecbe914-6ead-4d05-bf8c-d87cd0c72654; Proxy: null)
I don't understand how the .attrXYZ
call for instanceId could be malformed. I am using all over the rest of my infra and it has been working just fine as similar arguments.
I manually checked via the AWS console to see if that NAT Gateway id was incorrect, and it matches perfectly. I don't see why this is failing. I guessed perhaps that maybe the NAT gateway wasn't being created in time, so I added a dependency on it via
webserverRouteTableNatGWRoute.addDependency(webserverNatGateway)
but that didn't fix the error. Any ideas?
答案1
得分: 0
为了直接回答这个问题,原因是 instanceId
属性是用于 EC2 实例 ID 的。要将其指向 NAT 网关,您需要将网关 ID 传递给 natGatewayId
属性。
修改如下:
const webserverRouteTableNatGWRoute = new ec2.CfnRoute(this, 'webserver-rt-natgw-route', {
routeTableId: webserverRouteTable.attrRouteTableId,
destinationCidrBlock: '0.0.0.0/0',
natGatewayId: webserverNatGateway.attrNatGatewayId // 不同的属性名称
})
英文:
To answer the question directly, it is because the instanceId
prop is for an EC2 instance ID. To point it to a NAT gateway, you need to pass the gateway ID to the natGatewayId
prop instead.
Like so:
const webserverRouteTableNatGWRoute = new ec2.CfnRoute(this, 'webserver-rt-natgw-route', {
routeTableId: webserverRouteTable.attrRouteTableId,
destinationCidrBlock: '0.0.0.0/0',
natGatewayId: webserverNatGateway.attrNatGatewayId // different prop name
})
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论