如何从我的 Lambda 函数访问本地 HTTP 服务?

How do I access on-prem HTTP services from my Lambda function?

我创建了一个由 API 网关请求触发的 javascript lambda 函数。我已经从我的前端对其进行了测试,它运行良好(托管在 AWS 外部)。

但是,在我的函数中,我需要从本地网络调用 HTTP 服务作为 API 调用。我已经通过我机器上的本地 VPN 连接测试了该服务,它运行起来非常棒。阅读 AWS 文档后,我得出结论,我需要在 VPC 内将我的 lambda 配置为 运行,并将该 VPC 连接到站点到站点 VPN。

我创建了站点到站点 VPN,隧道正常运行。我为本地网络创建了客户端网关,还为 AWS 网络创建了虚拟专用网关。我选中了将我在创建 VPN 时声明的本地 IP 前缀传播到路由 table 的复选框。 (我知道 IP 前缀是我需要到达的本地 IP 端点。例如,假设我的服务托管在 172.31.0.2 和 172.31.15.22,所以我将它们声明为 /32,因为它们是单个 IP 地址AWS 要求我提供 CIDR。)

我还创建了我的 VPC,将其关联到 VPN 并声明了一个子网。网络管理员给了我一个 CIDR 范围作为我们 AWS 服务的路由选项(比方说 172.31.50.160/29),所以我将 VPC CIDR 声明为 172.21.0.0/16,子网声明为 172.31.50.160/28。我还确保 lambda 配置指定了我新创建的 VPC 和子网以及安全组。

虽然我的前端仍然可以毫无问题地调用 lambda,但我似乎无法访问本地网络。我总是收到 ENOTFOUND 错误,所以我认为这意味着 API 调用没有通过 VPN 隧道,因为服务只能通过隧道访问。所以我猜这很可能是路由错误。但是,我不确定如何解决它。

我的路由 table 显示传播的 IP 和虚拟专用网关作为目的地,以及目的地为本地的 172.31.0.0/16。我想这可能是一个路由错误,也许我将 CIDR 范围设置为 VPC 范围时犯了一个错误。

我还尝试将 cloudwatch 日志记录添加到 VPC 以检查流量,但没有记录任何内容,它总是空的。我确保我为此使用的 IAM 角色具有 cloudwatch 权限,认为这可能是问题所在,但即使在那之后日志还是空的。

如您所见,我只有 非常 的网络基础知识,因此不胜感激!

TL;DR

目标: 允许我的 lambda 函数访问本地机器中的本地服务。

预期结果:将 lambda 连接到关联到 运行ning VPN 的 VPC 后,我的 lambda 将能够到达本地计算机。

实际结果:lambda 无法定位本地机器(getaddrinfo ENOTFOUND 错误),好像流量没有通过 VPN 隧道。

事实证明,如果没有 public NAT 网关和正确的路由,lambda 无法直接访问互联网,同样,如果没有私有 NAT 网关,lambda 也无法通过 VPN 访问 on-prem 机器。

所以我在我的 VPC 中创建了一个私有子网,使用 on-prem 网络管理员给我的 CIDR 范围。然后我将我的请求路由到 on-prem 机器到私有 NAT 网关。这个私有子网的路由 table 将我的流量定向到虚拟私有网关,这样我就能够到达 on-prem 台机器。

总结

  1. 在您的 VPC 中创建私有子网(不要将其关联到 lambda)
  2. 创建私有 NAT 网关并将其与您的新子网相关联
  3. 在管理与 lambda 关联的子网的路由 table 上,将您对 on-prem 机器的请求路由到您在第 2 步中创建的私有 NAT 网关
  4. 在专用 NAT 的路由 table 上,将请求路由到与您的 VPN 关联的虚拟专用网关

完成后,您应该能够将 HTTP 请求从您的 lambda 发送到您的 on-prem 服务器。