目标
- 我正在使用 AWS 的"new"API Gateway Websocket 服务
- 我想使用 Websocket 客户端连接到 Lambda 函数
- 我想使用
ApiGatewayManager
响应客户端 - Lambda 函数需要与我的 RDS 位于 VPC 中,以提高安全性(RDS 不可公开访问,安全组中的指定 IP 除外)
- 我将
Node.js 8
与Typescript
结合使用
方法
我为 Websockets 创建了一个区域性 AWS API 网关,并为 $connect
、$disconnect
添加了一个 Lambda 函数,并为 subscribeChannel
操作添加了一个 Lambda 函数。
我能够连接并向已连接的客户端发送消息。
我还创建了一个具有 3 个私有(private)子网的 VPC,所有子网均位于 eu-central-1
中,每个子网位于不同的可用区 (AZ)。
当您将 Lambda 函数添加到 VPC 时,它们会失去对公共(public)互联网的访问权限,因此一种方法是添加另一个公共(public)子网并向其添加 NAT 网关。
现在,我正在更改私有(private)子网的路由表,将 0.0.0.0/0
委托(delegate)给 NAT,并在公共(public)子网的路由表中将 0.0.0.0/0
路由到 Internet 网关。
这似乎可以访问公共(public)互联网,例如我可以请求 https://google.com
,但 ApiGatewayManagement 超时,好像无法解析 AWS 服务。
然后我研究了 VPC 终端 Node ,因为它们旨在使公共(public) AWS 服务在私有(private)子网中可用,而无需通过互联网路由。我能够设置它并接收私有(private) DNS 网址。但在这里我被困住了,我不知道如何在我的设置/代码中使用它。
我使用无服务器框架和 Cloud Formation 资源管理整个项目。
问题
如果 subscribeChannel
的操作处理程序与 VPC 关联,则对 XXXXXXXX.execute-api.eu-central-1.amazonaws.com/develop
的请求会超时,因为它无法到达公共(public)互联网。
NAT 网关是正确的方法还是我需要使用 VPC 端点来执行 api? 如何正确配置 VPC 以使用此私有(private) DNS?
代码
async function channelHandler(event, context) {
return new aws_sdk_1.ApiGatewayManagementApi({
apiVersion: "2018-11-29",
endpoint: event.requestContext.domainName + "/" + event.requestContext.stage,
})
.postToConnection({
ConnectionId: event.requestContext.connectionId,
Data: "Hello, world!",
}).promise()
.then(() => {
return {
statusCode: 200,
body: "Sent message!",
};
})
.catch((error) => {
return {
statusCode: 500,
body: JSON.stringify(error),
};
});
}
到目前为止使用的资源:
- https://serverless.com/blog/api-gateway-websockets-example/
- https://github.com/serverless/serverless-websockets-plugin
- https://aws.amazon.com/blogs/compute/announcing-websocket-apis-in-amazon-api-gateway/
- https://github.com/yai333/React-Chat-App-using-AWS-API-Gateway-Websocket-and-Serverless-Framework
最佳答案
我确实从我的配置中重新创建了完整的项目,并“神奇地”开始工作。 因此我只能对正在发生的事情做出假设:
每个可用区都有一个私有(private)子网和一个公有子网。 根据AWS Documentation for NAT Gateways需要在每个NAT网关中创建一个NAT网关,但我只在A区配置了一个NAT网关。
我将 Lambda 函数的配置更改为仅放置在一个可用区中(在项目投入生产之前我不想实现完全冗余),现在 NAT 网关位于同一个可用区中。
简单图表:
Client --[AWS]--> Lambda --[Private Subnet]--> NAT --[Public Subnet]--> API Gateway
我仍然想知道是否可以使用 VPC 端点而不是 API 网关来访问 API 网关,但目前我将保留此配置。
关于javascript - 从 VPC 中的 Lambda 访问 API Gateway - 请求超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54201788/