Amazon Lambda 中的错误处理和自动重试 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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

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

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

常见调用错误
  • 请求 – 请求事件过大或 JSON 无效;函数不存在;或者参数值是错误的类型。

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

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

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

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

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

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

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

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

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

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

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

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

  • Amazon服务 – Amazon服务可能同步或异步调用您的函数。对于同步调用,服务将决定是否重试。例如,如果 Lambda 函数返回 TemporaryFailure 响应代码,则 Amazon S3 批处理操作会重试该操作。代理来自上游用户或客户端的请求的服务可能具有重试策略,或者可能将错误响应中继回请求者。例如,API Gateway 始终将错误响应中继回请求者。

    对于异步调用,行为与您同步调用函数时的行为相同。有关更多信息,请参阅 将 Amazon Lambda 与其他服务一起使用 下特定于服务的主题以及调用服务的文档。

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

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

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