Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
如何对 Lambda 函数调用超时错误进行故障排除?
即使我没有部署任何代码更改,我的 AWS Lambda 函数仍出现间歇性超时。
解决方法
Lambda 函数可能会因各种原因而超时。要对 Lambda 函数超时进行故障排除,请首先确定导致问题的原因。然后,根据您的使用案例修复问题。
验证您的 Lambda 函数是否超时
要检索任何超时调用的请求 ID,请在该函数的 Amazon CloudWatch 日志组中搜索短语 Task timed out。然后,使用关联的超时调用的请求 ID 来检索每个调用超时的完整日志。
有关说明,请参阅如何确定我的 Lambda 函数是否超时?
确定导致您的 Lambda 函数超时的原因
使用以下一种或多种方法来确定导致函数超时的故障点:
查看 Lambda 的 CloudWatch 日志
您可以使用 Amazon CloudWatch 查看函数代码生成的所有日志并识别潜在问题。有关说明,请参阅将 CloudWatch Logs 与 Lambda 结合使用。
如果您的函数返回堆栈跟踪,则堆栈跟踪中的错误消息会指明导致错误的原因。
重要事项:Lambda 会自动为每个调用生成三行日志(START、END 和 REPORT)。如果满足以下任一条件,则函数的 CloudWatch 日志中将仅显示这三行:
- Lambda 函数的自定义代码中没有配置其他显式日志记录。
- 在 Lambda 可以运行输出日志的函数代码之前,已达到函数的持续时间限制。
如果您无法从 CloudWatch 日志中确定导致超时的原因,请尝试以下一种或多种解决方案:
- 验证您使用的 AWS SDK 上的重试计数和超时设置是否有足够的时间让函数初始化。
- 临时增加 Lambda 函数的超时设置,以便有足够的时间让函数代码生成日志数据。
- 增加函数的配置内存,以帮助减少调用持续时间延迟并提高计算能力。
要将更多的日志记录输出添加到函数的代码,请参阅您使用的 Lambda 运行时版本对应的以下文档:
- 采用 Node.js 编写的 AWS Lambda 函数日志记录
- 采用 Python 编写的 AWS Lambda 函数日志记录
- 采用 Ruby 编写的 AWS Lambda 函数日志记录
- 采用 Java 编写的 AWS Lambda 函数日志记录
- 采用 Go 编写的 AWS Lambda 函数日志记录
- 采用 C# 编写的 AWS Lambda 函数日志记录
- 采用 PowerShell 编写的 AWS Lambda 函数日志记录
使用 AWS X-Ray 确定任何代码的性能瓶颈
如果您的 Lambda 函数使用下游 AWS 资源、微服务、数据库或 HTTP Web API,则您可以使用 AWS X-Ray 来排查代码性能问题。
有关详细信息,请参阅使用 AWS X-Ray 可视化 Lambda 函数调用。
使用 Lambda Insights 收集函数的系统级指标
Lambda Insights 收集系统级指标,包括 CPU 时间、内存、磁盘和网络指标。它还收集诊断信息,包括冷启动次数和 Lambda 工作线程关闭次数,以帮助您隔离与 Lambda 函数相关的问题。
**注意:**使用 Lambda Insights 会向您的 AWS 账户收取费用。您需要为 Lambda 扩展所使用的调用时间(以 1 毫秒为增量)付费。
使用 VPC 流日志来确定特定调用请求被拒绝或未路由的原因
通过 VPC 流日志,您可以查看流入和流出 Amazon Virtual Private Cloud (Amazon VPC) 的所有网络流量。
有关详细信息,请参阅 Lambda 中的联网问题疑难解答。
**注意:**如果您选择设置 VPC 流日志,则以下变量适用:
- 当您将流日志发布到 CloudWatch Logs 或 Amazon Simple Storage Service (Amazon S3) 时,将收取公开日志的数据摄取和存档费用。
- 当您将 Lambda 函数配置为访问 Amazon VPC 中的资源时,Lambda 会将该函数分配给弹性网络接口。要识别与您的 Lambda 函数关联的网络流量,您必须找到该函数的网络接口。有关说明,请参阅为什么我无法分离或删除 Lambda 创建的弹性网络接口?
使用 HTTP 线路跟踪对函数代码在调用过程中生成的网络请求进行详细的日志记录
有关详细信息,请参阅 Logging HTTP wire traces。
防止 Lambda 函数超时的最佳实践
确保您的 Lambda 函数是幂等的
由于临时网络问题,API 调用花费的时间可能比预期的要长。网络问题还可能导致重试和 API 请求重复。要为这些情况做好准备,请确保您的 Lambda 函数是幂等的。
有关详细信息,请参阅如何让我的 Lambda 函数保持幂等性?
在函数处理程序之外初始化函数的静态逻辑
初始化 Lambda 函数时,Lambda 最多会分配 10 秒来完成调用的初始化阶段。由于此时间限制,最佳做法是在初始化代码中的函数处理程序外执行以下操作:
- 导入库和依赖项
- 设置初始配置
- 初始化与其他下游服务和资源的连接
这种静态初始化允许这些资源在每个沙盒中初始化一次,然后在同一个运行时环境中将来的所有调用中重复使用。
有关详细信息,请参阅优化静态初始化。
**注意:**Lambda 将删除与下游资源的空闲连接。要允许函数保持持久连接,请使用与您使用的 Lambda 运行时关联的 TCP keepAlive 变量。
验证您使用的 AWS SDK 上的重试计数和超时设置是否有足够的时间让函数初始化
如果您使用 AWS SDK 发起 API 调用,但调用失败,则 AWS SDK 会自动重试该调用。AWS SDK 重试的次数和每次重试的时间由每个 AWS SDK 的设置决定,不同 AWS SDK 的设置有所不同。函数初始化所需的时间可能要超过默认 AWS SDK 设置所允许的时间。
有关详细信息,请参阅如何解决在使用 AWS SDK 调用 Lambda 函数时出现的重试和超时问题?
(可选)为 Lambda 函数配置预置并发
预置并发会初始化请求数量的运行时环境,以便它们准备好立即响应您的函数调用。要为函数设置预置并发,请按照配置预置并发中的说明进行操作。
**注意:**配置预置并发会向您的 AWS 账户收取费用。您可以在函数的某个版本或 Lambda 函数别名上配置预置并发。
验证 Lambda 函数是否有足够的系统资源
分配给 Lambda 函数调用的网络带宽和 CPU 量由该函数的内存配置决定。
有关详细信息,请参阅内存和计算能力。
确保您的 Lambda 函数使用的任何后台进程在函数处理程序返回字符串之前均已完成
有关详细信息,请参阅 Understanding container reuse in AWS Lambda。
验证您的 Lambda 函数是否配置为在任何集成 AWS 服务的最大超时设置内运行
尽管 Lambda 函数的最大调用超时限制为 15 分钟,但其他 AWS 服务可能具有不同的超时限制。
例如,Amazon API Gateway 最多会等待 29 秒来完成 Lambda 函数代理调用。
有关详细信息,请参阅如何解决在将 API Gateway 与 Lambda 函数集成时遇到的错误?另外,请参阅使用来自其他 AWS 服务的事件调用 Lambda。
确认您的函数正在尝试访问的端点具有有效的网络路径
要查看您的网络设置,请按照如何排查 Amazon VPC 中 Lambda 函数的超时问题?中的说明进行操作

相关内容
- AWS 官方已更新 3 年前