如何排查 Lambda 函数故障?

上次更新日期:2021 年 5 月 19 日

尝试调用我的 AWS Lambda 函数时,调用失败并返回错误。如何排查 Lambda 函数故障?

解决方法

要排查 Lambda 函数故障,请首先使用本文中列出的一项或多项 AWS 服务和功能来确定导致错误的原因。然后按照提供的链接,查看对每个问题进行故障排除的最佳实践。

识别和排查任何权限错误

如果您的 Lambda 部署软件包的安全权限不正确,则会出现以下错误之一:

  • EACCES: permission denied, open '/var/task/index.js'
  • cannot load such file -- function
  • [Errno 13] Permission denied: '/var/task/function.py'

如果您的 AWS Identity and Access Management (IAM) 用户(或您担任的角色)没有权限调用函数,则会出现以下错误:

User: arn:aws:iam::123456789012:user/developer is not authorized to perform: lambda:InvokeFunction on resource: my-function

排查 Lambda 权限错误

在 AWS CloudTrail 中查看 Lambda 日志文件条目。调用 Lambda 的请求者必须拥有调用您的函数所需的 AWS Identity and Access Management (IAM) 权限。要授予所需权限,请更新您的 Lambda 函数权限

有关更多信息,请参阅了解 AWS Lambda 日志文件条目对 AWS Lambda 身份和访问进行故障排除以及 IAM: lambda: InvokeFunction 未授权

识别并排查任何代码错误

如果您的 Lambda 代码存在问题,则会出现许多类型的错误。以下是一些较常见的 Lambda 代码相关错误:

  • Unable to marshal response: Object of type AttributeError is not JSON serializable
  • 问题:运行时包含的 AWS 开发工具包不是最新版本
  • (Node.js) 函数在代码完成执行之前返回
  • KeyError

排查 Lambda 代码错误

1.    查看 Lambda 的 Amazon CloudWatch Logs。

您可以使用 CloudWatch 查看由函数代码生成的所有日志,并识别潜在问题。有关更多信息,请参阅访问 Amazon CloudWatch 的 AWS Lambda 日志。有关函数日志记录的详细信息,请按照以下与您所用编程语言对应的 Lambda 函数日志记录说明进行处理:

注意:如果您的函数返回堆栈跟踪,则堆栈跟踪中的错误信息会指出错误原因。

2.    使用 AWS X-Ray 确定任何代码的性能瓶颈。如果您的 Lambda 函数调用下游 AWS 资源、微服务、数据库或 HTTP Web API,请使用 AWS X-Ray 来排查代码性能问题。有关更多信息,请参阅将 AWS Lambda 与 AWS X-Ray 结合使用

3.    确认函数的部署程序包可以导入任何必需的依赖项。请按照与您所用编程语言对应的部署程序包说明进行处理:

注意:您还可以使用 Lambda 层来添加部署程序包之外的依赖项。

4.    (对于作为容器映像部署的代码)确认您正确安装了运行时接口客户端并正确部署了映像。请按照与您所用编程语言对应的容器映像说明进行处理:

识别并排查任何网络错误

如果您的 Lambda 网络配置存在问题,则会出现许多类型的错误。以下是一些最常见的 Lambda 网络相关错误:

如果您的函数位于 Virtual Private Cloud (VPC) 中,无法访问互联网或访问超时,则会出现以下错误:

connect ETIMEDOUT 176.32.98.189:443
Task timed out after 10.00 seconds

如果您的函数所在的 VPC 达到弹性网络接口限制,会出现以下错误:

ENILimitReachedException: The elastic network interface limit was reached for the function's VPC.

如果断开传输控制协议 (TCP) 连接,则会出现以下错误:

Connection reset by peer

要排查 Lambda 网络错误,请执行以下操作:

1.    确认您的函数正在尝试访问的终端节点有一个有效的网络路径。有关更多信息,请参阅配置 Lambda 函数以访问 VPC 中的资源

2.    (对于连接到 Amazon VPC 的函数)确认您的函数可以访问互联网。有关更多信息,请参阅如何为连接到 Amazon VPC 的 Lambda 函数提供互联网访问权限? 此外,请参阅如何使用 Lambda 函数排查 VPC 中的超时问题?

注意:如果在查看 VPC 配置后仍无法确定为什么函数代码未到达公共终端节点,请参阅 VPC 流日志。利用 VPC 流日志功能,您可以查看往返 VPC 的所有网络流量,从而确定请求被拒绝或未被传输的原因。有关更多信息,请参阅 Lambda 中的联网问题疑难解答

识别并排查任何限流错误

如果您的函数受到限流,则会出现以下错误:

Rate exceeded
429 TooManyRequestsException

要排查 Lambda 限流错误,请执行以下操作:

查看您的 Lambda CloudWatch 指标。有关更多信息,请参阅 AWS Lambda CloudWatch 指标

需要监控的关键指标:

  • ConcurrentExecutions
  • UnreservedConcurrentExecutions
  • Throttles

注意:如果调用函数的请求过于频繁,以致其无法及时扩展,或者超过并发限制,则这些请求会因限制错误而失败(状态代码为 429)。有关更多信息,请参阅 AWS Lambda 函数扩展。此外,请参阅如何排查出现“Rate Exceeded”和 429 “TooManyRequestsException”错误时的 Lambda 函数限流问题?

识别并排查任何 Invoke API 500 和 502 错误

如果您的调用请求失败,则会出现以下 502 或 500 服务器错误:

  • InvalidRuntimeException
  • InvalidSecurityGroupIDException
  • InvalidZipFileException
  • KMSAccessDeniedException
  • KMSNotFoundException
  • You have exceeded the maximum limit for Hyperplane ENIs for your account
  • SubnetIPAddressLimitReachedException

对 Lambda Invoke API 500 和 502 错误进行故障排除

请按照如何排查调用 Lambda 函数时出现的 502 和 500 错误?中的说明进行处理 有关可能的错误列表及其描述,请参阅 Lambda Invoke API 参考中的错误部分。

识别并排查任何容器映像错误

如果您使用的是容器映像,并且容器映像存在问题,则会出现以下任意一项错误:

  • "errorType": "Runtime.InvalidEntrypoint"
  • Error: You are using an AWS CloudFormation template, and your container ENTRYPOINT is being overridden with a null or empty value.

Lambda 容器映像错误

请参照 Lambda 中的容器映像问题疑难解答中的说明进行处理。

注意:如果您不确定导致错误的问题类型,请按照本文识别和排查 Lambda 代码错误部分中的说明进行处理。