如何排查 Lambda 函数失败的问题?

上次更新时间:2019 年 10 月 16 日

当我运行 AWS Lambda 函数时,运行失败并显示错误。如何排查这个问题?

简要描述

Lambda 函数失败通常由以下原因引起:

权限问题 代码问题 网络问题 限流 Invoke API 500 和 502 错误

根据您的 Lambda 代码和配置,您可以使用以下 AWS 服务和功能来确定原因:

AWS CloudTrail Amazon CloudWatch Logs AWS X-Ray CloudWatch 中的 Lambda 指标

查看以下常见问题类型,以确定要使用的服务或功能,以及在哪里可以找到更多信息和问题排查说明。

解决方法

权限问题

CloudTrail 将您的 AWS 账户中的 API 调用捕获为事件。当您的 Lambda 函数无法调用时,请查看 Lambda 的 CloudTrail 日志条目。

调用 Lambda 的请求者必须拥有调用您的函数所需的 AWS Identity and Access Management (IAM) 权限。如果请求者没有权限,请更新您的 Lambda 函数权限,以授予他们权限。有关更多信息,请参阅故障排除 AWS Lambda 身份和访问。

代码问题

CloudWatch Logs

要了解 Lambda 函数失败的详细信息,请在 CloudWatch 中查看 Lambda 日志。有关更多信息,请参阅所用编程语言的日志记录说明:

采用 Python 编写的 AWS Lambda 函数日志记录 采用 Node.js 编写的 AWS Lambda 函数日志记录 采用 Java 编写的 AWS Lambda 函数日志记录 采用 Go 编写的 AWS Lambda 函数日志记录 采用 C# 编写的 AWS Lambda 函数日志记录 采用 PowerShell 编写的 AWS Lambda 函数日志记录 采用 Ruby 编写的 AWS Lambda 函数日志记录

X-Ray

如果您的 Lambda 函数使用下游 AWS 资源、微服务、数据库或 HTTP Web API,请使用 X-Ray 来排查问题。

依赖关系

如果 Lambda 函数的部署程序包包含任何依赖关系,请确保您的代码可以成功导入它们。有关更多信息,请参阅所用编程语言的说明:

Python 中的 AWS Lambda 部署程序包 Node.js 中的 AWS Lambda 部署程序包 Java 中的 AWS Lambda 部署程序包 Go 中的 AWS Lambda 部署程序包 C# 中的 AWS Lambda 部署程序包 PowerShell 中的 AWS Lambda 部署程序包 Ruby 中的 AWS Lambda 部署程序包

或者,您可以使用 Lambda 层添加部署程序包之外的依赖关系。

网络问题

如果您的 Lambda 函数连接到 Amazon Virtual Private Cloud (Amazon VPC),请确保所有内容已正确配置。有关更多信息,请参阅配置 Lambda 函数以访问 VPC 中的资源。

如果连接到 Amazon VPC 的 Lambda 函数需要访问互联网,请确保为它提供互联网访问权限。

限流

如果调用 Lambda 函数的请求过于频繁,以致其无法及时扩展,或者超过并发限制,则这些请求将失败,并显示 429 限流错误。有关更多信息,请参阅 AWS Lambda 函数扩展。

可使用 CloudWatch 监视 Lambda 指标 ConcurrentExecutionsUnreservedConcurrentExecutionsThrottles 帮助进行原因排查。有关更多信息,请参阅 AWS Lambda CloudWatch 指标。

调用 API 502 和 500 错误

如果您的 Lambda 函数由于 502 或 500 服务器错误而失败,请查看这些问题排查说明。

有关可能的错误列表及其描述,请参阅 Lambda Invoke API 参考中的错误部分。