javascript - 从 VPC 中的 Lambda 访问 API Gateway - 请求超时

标签 javascript node.js networking aws-lambda aws-sdk

目标

  • 我正在使用 AWS 的"new"API Gateway Websocket 服务
  • 我想使用 Websocket 客户端连接到 Lambda 函数
  • 我想使用 ApiGatewayManager 响应客户端
  • Lambda 函数需要与我的 RDS 位于 VPC 中,以提高安全性(RDS 不可公开访问,安全组中的指定 IP 除外)
  • 我将 Node.js 8Typescript 结合使用

方法

我为 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),
        };
    });
}

到目前为止使用的资源:

最佳答案

我确实从我的配置中重新创建了完整的项目,并“神奇地”开始工作。 因此我只能对正在发生的事情做出假设:

每个可用区都有一个私有(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/

相关文章:

javascript - 类型错误 : Cannot read property 'contentWindow' of undefined

javascript - 为什么这里的变量声明据说是多余的

使用 CORS 的 Javascript 和 angularjs

python - 如何在 Windows 7 上使用 Python 计算网络使用情况?

linux - windows 下是否有与 justniffer 等效的嗅探器?

javascript - 如何将外部 javascript 文件集成到 PugJS 中?

javascript - 调试 jQuery AJAX 响应 : what I'm doing wrong?

javascript - Qt编程: How to use custom data type in QVariantMap?

node.js - Mongoose findOneAndUpdate 嵌套文档

mysql - 从我的应用程序连接到远程 mysql 服务器。问题是Mysql服务器在局域网上