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

3 分钟阅读
0

我希望解决在将 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 日志)**复选框。
对于 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 日志记录

确定集成类型、验证错误并执行后续步骤

1.    确定是在 API Gateway 中设置了 Lambda 代理集成还是 Lambda 自定义集成。您可以通过查看 Lambda 函数输出或运行 get-integration 命令来验证集成类型。

2.    验证 API Gateway 中的错误是否与 Lambda 中的错误相对应。运行以下 CloudWatch Logs Insights 查询,查找指定时间范围内的错误状态代码:

parse @message '(*) *' as reqId, message
    | filter message like /Method completed with status: \d\d\d/
    | parse message 'Method completed with status: *' as status
    | filter status != 200
    | sort @timestamp asc
    | limit 50

然后,运行以下 CloudWatch Logs Insights 查询,搜索同一时间段内的 Lambda 错误日志:

fields @timestamp, @message
    | filter @message like /(?i)(Exception|error|fail)/
    | sort @timestamp desc
    | limit 20

3.    根据您在日志中识别的错误类型,选择下面的一种操作:

如果您收到以下错误,请完成 **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

如果您遇到以下任何一种错误,请完成解决超时问题部分中的步骤。

对于 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

如果您遇到以下错误,请完成解决函数错误部分中的步骤。

(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 指标使用 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。异步调用函数 B 时,函数 A 可以向 API Gateway 返回成功的响应。

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

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

解决函数错误

如果您在调用 API 时收到函数错误,请检查您的 Lambda 函数是否存在任何语法错误。如果您的 Lambda 函数没有返回 API 网关期望用于代理集成的有效 JSON 对象,则会出现此错误。

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


相关信息

处理 API Gateway 中的标准 Lambda 错误

处理 API Gateway 中的自定义 Lambda 错误

AWS 官方
AWS 官方已更新 1 年前