每次我向外部 API 发出请求时,API Gateway 上的 API 都会返回错误 502

分享于2023年05月01日 amazon-web-services aws-api-gateway aws-lambda node.js 问答
【问题标题】:My API on API Gatway returns error 502 every time I make a request to an external API每次我向外部 API 发出请求时,API Gateway 上的 API 都会返回错误 502
【发布时间】:2023-04-30 11:56:02
【问题描述】:

我有一个 NodeJS Rest API,它通过 Serverless 部署在 AWS 上,它会自动为我在 API Gateway 上创建一个 Lambda 函数和一个 API。

每次我尝试向任何外部 API 发出 HTTPS 请求时,我都会从 API Gateway 收到错误(502 - 内部服务器错误),即使我在本地 PC 上测试时一切正常。只有当我调用发出外部请求的路由时才会发生错误,所以我确定这就是问题所在。

我已经使用 Cloudwatch 激活了 API 网关日志(在 this 发布之后),但我得到的唯一重要日志是 Endpoint response body before transformations: {"errorMessage":"2020-10-21T18:34:14.038Z 4cf0e078-fec9-4b9c-a199-26216a3951aa Task timed out after 6.01 seconds"} that 图像中的完整日志)。 Lambda 日志不太详细,但 here 确实如此。

我还为我的 Lambda 函数设置了 VPC 和安全组。我的安全组已经允许入站和出站规则的所有流量。我的 VPC 可能是问题所在,因为我对子网和那里的配置不太了解。 These 是我的 Lambda VPC 配置。

谁能告诉我有什么问题?我可以添加您可能想要/需要的更多信息。

--------- 编辑1:

我尝试按照 this 发帖的步骤进行操作,但没有成功。让我解释一下我所做的一切:

首先,我创建了一个到我的 VPC 的 NAT 网关和一个新的路由表,其中 0.0.0.0/0 目标路由到这个 NAT 网关。然后我创建了一个公共子网,为其分配了新的路由表并打开了 Enable auto-assign public IPv4 address 选项。最后,我将这个新的公共子网分配给了我的 Lambda 函数,但错误仍然存​​在。我还尝试从 Lambda 函数中删除公共子网,因为有人说它可以在 the post 上工作,但它仍然没有工作。

我唯一不能做的就是将我的新公共子网设置为默认子网。我不知道这是否是一项核心工作,是否只是因为这个而不起作用。

我是不是忘记了什么?

  • 您尝试在同一个 VPC 中访问 API 吗?
  • 那么你的API网关调用的是Lambda函数,而Lambda函数调用的是外部API? Lambda 函数部署在 VPC 中?看起来您应该包含 Lambda 日志而不是 API 网关日志,但导致此问题的最可能原因是您没有在具有到 NAT 网关的路由的 VPC 子网中部署 Lambda 函数。
  • @MarkB 我用一些我试图解决问题的方法更新了帖子。它没有用 =/ 我还发布了你谈到的 Lambda 日志。他们在第三段
  • @rogerdpack 不,他们不是。但是我尝试访问的 API 来自其他域,我认为我应该让我的 VPC 访问互联网,不是吗?

【解决方案1】:

我刚刚解决了。

我一直在互联网上搜索可能的解决方案,我找到了 this 链接,该链接在右上角(右 there )有一个完美教程的视频。

问题是我只有子网连接到互联网网关,没有子网连接到 NAT 网关,就像@MarkB 说的那样。但我试图通过更改分配给 Lambda 和 RDS 的仅有的 3 个私有子网来解决它,使其仅与 NAT 网关连接,并最终从我的 RDS 中删除 Internet 网关分配。

我决定仅为我的 Lambda 函数创建 3 个新的私有子网,它们连接到 NAT 网关,以及 1 个公共子网,连接到 Internet 网关。我之前已经拥有的子网最终完好无损,并且非常适合。

【讨论】: