AWS Lambda
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

AWS Lambda 中的错误处理和自动重试

调用函数时,可能会发生两种类型的错误。在您的函数收到调用请求之前拒绝调用请求时会发生调用错误。当函数的代码或运行时返回错误时,会发生函数错误。根据错误类型、调用类型以及调用该函数的客户端或服务,重试行为和管理错误的策略会有所不同。

请求、调用方或账户的问题可能会导致调用错误。调用错误包括响应中的错误类型和状态代码,它们指示错误的原因。

常见调用错误

  • 请求 – 请求事件太大或 JSON 无效;函数不存在;参数值是错误的类型。

  • 调用方 – 用户或服务无权调用该函数。

  • 账户 – 已在运行最大数量的函数实例,或者请求过快。

诸如 AWS CLI 和 AWS 开发工具包之类的客户端会重试客户端超时、限制错误 (429) 以及不是由错误请求(500 系列)引起的其他错误。有关调用错误的完整列表,请参阅调用 API 参考文档

当您的函数代码或代码使用的运行时返回错误时,会发生函数错误。

常见函数错误

  • 函数 – 您的函数的代码抛出异常或返回错误对象。

  • 运行时 – 运行时终止了您的函数(因为它耗尽了时间);检测到语法错误;或者无法将响应对象编组为 JSON。函数退出,并返回错误代码。

与调用错误不同,函数错误不会导致 Lambda 返回 400 系列或 500 系列状态代码。如果函数返回错误,则 Lambda 通过包含名为 X-Amz-Function-Error 的标头和带有错误消息和其他详细信息的 JSON 格式响应来指示此错误。有关每个语言中的函数错误的示例,请参阅以下主题。

直接调用函数时,您负责确定处理错误的策略。您可以重试、将事件发送到队列以进行调试,或者忽略该错误。您的函数代码可能已完全、部分或根本不运行。如要重试,请确保您的函数代码可以多次处理相同的事件,而不会导致重复的事务或其他不必要的副作用。

间接调用函数时,您需要了解调用者的重试行为以及请求在此过程中遇到的任何服务。这包括以下场景。

  • 异步调用 – Lambda 会针对函数错误重试两次。如果该函数没有足够的容量来处理所有传入请求,则事件可能会在队列中等待数小时或数天才能发送到该函数。您可以在函数上配置死信队列以捕获未成功处理的事件。有关更多信息,请参阅 异步调用

  • 事件源映射 – 从流中读取的事件源映射将重试整个批次的项。重复错误会阻止受影响的分片的处理,直到错误得到解决或项失效为止。要检测停顿的分片,您可以监控迭代器使用寿命指标。

    对于从队列中读取的事件源映射,您可以通过在源队列上配置可见性超时和重新驱动策略来确定失败事件的重试次数以及目标之间的时间长度。有关更多信息,请参阅 AWS Lambda 事件源映射 以及将 AWS Lambda 与其他服务结合使用下方特定于服务的主题。

  • AWS 服务 – AWS 服务可能同步或异步调用您的函数。对于同步调用,服务会负责重试。对于异步调用,行为与您异步调用函数时的行为相同。有关更多信息,请参阅 将 AWS Lambda 与其他服务结合使用 以及调用服务文档下的特定于服务的主题。

  • 其他账户和客户端 – 当您向其他账户授予访问权限时,可以使用基于资源的策略来限制可配置以调用您的函数的服务或资源。为了保护您的函数不发生过载情况,请考虑使用 Amazon API Gateway 在您的函数前面放置一个 API 层。

为了帮助您处理 Lambda 应用程序中的错误,Lambda 集成了 Amazon CloudWatch 和 AWS X-Ray 等服务。您可以结合使用日志、指标、警报和跟踪来快速检测和识别函数代码,API 或支持您的应用程序的其他资源中的问题。有关更多信息,请参阅 对基于 Lambda 的应用程序进行监控和问题排查

有关使用 CloudWatch Logs 订阅,X-Ray 跟踪和 Lambda 函数来检测和处理错误的示例应用程序,请参阅 AWS Lambda 错误处理器示例应用程序