如何解决在将 API Gateway 与 Lambda 函数集成时出现的错误?

上次更新日期:2021 年 4 月 6 日

我希望解决在将 Amazon API Gateway 与 AWS Lambda 函数集成时出现的错误。

解决方案

针对您的 API 和阶段打开日志记录

1.    在 API Gateway 控制台中,为您的 API 找到 Stage Editor(阶段编辑器)

2.    在 Stage Editor(阶段编辑器)窗格中,选择 Logs/Tracing(日志/跟踪)选项卡。

3.     在 Logs/Tracing(日志/跟踪)选项卡上的 CloudWatch Settings(CloudWatch 设置)下,执行以下操作以打开日志记录:
选中 Enable CloudWatch Logs(启用 CloudWatch Logs)复选框。
对于 Log level(日志级别),选择 INFO(信息)以针对所有请求生成日志。或者选择 ERROR(错误)以仅针对导致错误的 API 请求生成日志。
对于 REST API,选中 Log full requests/responses data(记录完整请求/响应数据)复选框。或者,对于 WebSocket API,选择 Log full message data(记录完整消息数据)复选框。

4.    在 Custom Access Logging(自定义访问日志记录)下,执行以下操作以开启访问日志记录:
选中 Enable Access Logging(启用访问日志记录)复选框。
对于 Access Log Destination ARN(访问日志目标 ARN),输入 CloudWatch 日志组Amazon Kinesis Data Firehose 流的 Amazon 资源名称 (ARN)。
输入 Log Format(日志格式)。对于指导,选择 CLFJSONXMLCSV,从而以该格式查看示例。

5.    选择 Save Changes(保存更改)。
注意:控制台不会确认设置是否已保存。

有关更多信息,请参阅使用 API Gateway 控制台设置 CloudWatch API 日志记录

6.    根据您在日志中识别的错误类型,选择以下选项之一:

如果您收到以下错误,请完成 Resolve concurrency issues(解决并发问题)部分中的步骤。

(XXXXX) Lambda invocation failed with status: 429. Lambda request id: XXXXXXXXXX
(XXXXX) Execution failed due to configuration error: Rate Exceeded.
(XXXXX) Method completed with status: 500

如果您收到以下任一错误,请完成 Resolve timeout issues(解决超时问题)部分中的步骤。

对于 Lambda 自定义集成:

< 29 sec:
(XXXXX) Method response body after transformations: {"errorMessage":"2019-08-14T02:45:14.133Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after xx.01 seconds"}
> 29 sec:
(XXXXX) Execution failed due to a timeout error

对于 Lambda 代理集成:

< 29 sec:
(XXXXX) Endpoint response body before transformations: {"errorMessage":"2019-08-14T02:50:25.865Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after xx.01 seconds"}
> 29 sec:
(XXXXX) Execution failed due to a timeout error

如果您收到以下错误,请完成 Resolve function errors(解决函数错误)部分中的步骤。

(XXXXX) Execution failed due to configuration error: Malformed Lambda proxy response
(XXXXX) Method response body after transformations: {"errorMessage": "Syntax error in module 'lambda_function'"}

解决并发问题

如果来自 API Gateway 的其他请求的速度超过您的 Lambda 函数的扩展速度,您将收到 429 限制错误或 500 错误。

要解决这些错误,请在 CloudWatch 中分析 Count(计数)(API Gateway)、Throttles(限制)(Lambda) 和 ConcurrentExecutions (Lambda) 指标。请考虑以下事项:

  • Count(计数)(API Gateway) 是指给定时间段内的 API 请求总数。
  • Throttles(限制)(Lambda) 是受限制的调用请求的数量。当所有函数实例都在处理请求且没有可用于扩展的并发时,Lambda 会拒绝其他请求并发出 TooManyRequestsException 错误。受限制的请求和其他调用错误不算作调用或错误。
  • ConcurrentExecutions (Lambda) 是处理事件的函数实例的数量。如果此数字达到 AWS 区域的并发执行配额或您在函数上配置的预留并发限制,则会限制其他调用请求。

注意:有关更多信息,请参阅 API Gateway 指标使用 AWS Lambda 函数指标

如果您在 Lambda 函数中设置了预留并发,请为 Lambda 函数设置较高的预留并发值。或者,从 Lambda 函数中删除反向并发值。然后,该函数会从未预留的并发执行池中提取。

如果您没有在 Lambda 函数中设置预留并发,请查看 ConcurrentExecutions 指标以了解使用情况。有关更多信息,请参阅 Lambda 配额

解决超时问题

所有 API Gateway 集成的集成超时均为 29 秒(硬性限制)。在构建具有 Lambda 集成的 API Gateway API 时,可能会遇到两种情况。这两种情况是超时时间少于 29 秒或超过 29 秒。

如果您的 Lambda 函数超时少于 29 秒,请查看您的 Lambda 日志以调查此问题。如果您的 Lambda 函数必须在 29 秒后运行,请考虑异步调用 Lambda 函数。

对于 Lambda 自定义集成,请完成以下步骤:

1.    打开 API Gateway 控制台

2.    在导航窗格中,选择 API,然后选择您的 API。

3.    选择 Resources(资源),然后选择您的方法。

4.    选择 Integration Request(集成请求)

5.    选择 Method Request(方法请求)

6.    展开 HTTP Request Headers(HTTP 请求标头)

7.    选择 Add header(添加标头)

8.    在 Name(名称)中输入您的标头。例如:X-Amz-Invocation-Type

重要提示:您必须从“Event”(事件)中映射标头(需要单引号)。

对于 Lambda 代理集成:

请使用两个 Lambda 函数:函数 A 和函数 B。API Gateway 首先同步调用函数 A。然后,函数 A 异步调用函数 B。函数 A 不受函数 B 响应的影响,可以在异步调用函数 B 时向 API Gateway 返回成功的响应。

如果您使用的是 Lambda 代理集成,请考虑将其更改为自定义集成。但是,您必须配置映射模板才能将请求/响应转换为所需格式。有关更多信息,请参阅设置后端 Lambda 函数的异步调用

注意:由于异步 Lambda 函数在后台运行,因此您的客户端无法直接从 Lambda 函数接收数据。您必须有一个中间数据库来存储任何持久性数据。

解决函数错误

调用 API 时可能会收到函数错误。此错误可能是由于您的 Lambda 函数中的语法错误造成的。如果您的 Lambda 函数没有返回 API Gateway 期望用于代理集成的有效 JSON 对象,您也可能会收到此错误。

要解决此错误,请完成针对您的 API 和阶段开启日志记录部分中的步骤。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?