Lambda 中的执行问题疑难解答 - AWS Lambda

Lambda 中的执行问题疑难解答

当 Lambda 运行时运行函数代码时,可能会在已经处理事件一段时间的函数实例上处理事件,或者可能需要初始化一个新实例。在函数初始化期间、处理程序代码处理事件时或者当函数返回(或无法返回)响应,可能会发生错误。

函数执行错误可能是由您的代码、函数配置、下游资源或权限中的问题引起。如果您直接调用函数,则会在 Lambda 的响应中看到函数错误。如果您使用事件源映射或通过其他服务异步调用函数,则可能会在日志、死信队列或失败时的目标中找到错误。错误处理选项和重试行为因调用函数的方式和错误类型而异。

当您的函数代码或 Lambda 运行时返回错误时,来自 Lambda 的响应中的状态代码为“200 OK”。响应中是否存在错误由名为 X-Amz-Function-Error 的标头指示。400 和 500 系列状态代码保留用于调用错误

Lambda:执行时间过长

问题:函数执行时间太长。

如果您的代码在 Lambda 中运行所花费的时间长于在本地计算机上运行所花费的时间,则可能受到对该函数可用的内存或处理能力的限制。使用额外内存配置函数以增加内存和 CPU。

Lambda:未显示日志或跟踪

问题:日志未显示在 CloudWatch Logs 中。

问题:跟踪未显示在 AWS X-Ray 中。

您的函数需要权限才能调用 CloudWatch Logs 和 X-Ray。更新函数的执行角色以向其授予权限。添加以下托管策略以启用日志和跟踪。

  • AWSLambdaBasicExecutionRole

  • AWSXRayDaemonWriteAccess

向函数添加权限时,请同时简单更新其代码或配置。这会强制停止并替换函数的具有过时凭证的运行实例。

注意

函数调用后,日志可能需要 5 到 10 分钟才能显示。

Lambda:并非所有我的函数的日志都会出现

问题:尽管我拥有正确权限,但 CloudWatch Logs 中缺少函数日志

如果您的 AWS 账户 达到了其 CloudWatch Logs 限额限制,则 CloudWatch 就会对函数日志记录进行节流。发生这种情况时,您函数输出的某些日志可能不会出现在 CloudWatch Logs 中。

如果函数输出日志的速度过快,Lambda 无法对其进行处理,也会导致日志输出无法显示在 CloudWatch Logs 中。当 Lambda 无法按照函数生成日志的速度向 CloudWatch 发送日志时,它会丢弃日志以防止函数的执行速度减慢。单个日志流的日志吞吐量超过 2 MB/s 时,预计会持续观察到删除的日志。

如果函数配置为使用 JSON 格式的日志,则 Lambda 会在丢弃日志时尝试向 CloudWatch Logs 发送 logsDropped 事件。但是,当 CloudWatch 对函数的日志记录进行节流时,此事件可能无法到达 CloudWatch Logs,因此 Lambda 丢弃日志时您并不始终会看到记录。

要检查 AWS 账户 是否已达到其 CloudWatch Logs 限额限制,请执行以下操作:

  1. 打开服务限额控制台

  2. 在导航窗格中,选择 AWS 服务

  3. AWS 服务列表中,搜索 Amazon CloudWatch Logs。

  4. 服务限额列表中,选择 CreateLogGroup throttle limit in transactions per secondCreateLogStream throttle limit in transactions per secondPutLogEvents throttle limit in transactions per second 限额以查看利用率。

您还可以设置 CloudWatch 警报,以便在账户利用率超过您为这些限额指定的限制时提醒您。请参阅根据静态阈值创建 CloudWatch 告警以了解更多信息。

如果 CloudWatch Logs 的默认限额限制不足以满足您的用例,则可以请求增加限额

Lambda:函数在执行完成之前返回

问题:(Node.js) 函数在代码完成执行之前返回

许多库(包括 AWS 开发工具包)都是异步操作。当您进行网络调用或执行其他需要等待响应的操作时,库返回一个名为 promise 的对象,该对象在后台跟踪操作的进度。

要等待 promise 解析为响应,请使用 await 关键字。这会阻止您的处理程序代码执行,直到将 promise 解析为包含响应的对象。如果您不需要在代码中使用来自响应的数据,则可以直接将 promise 返回到运行时。

一些库不返回 promise,但可以包装到返回 promise 的代码中。有关更多信息,请参阅 定义采用 Node.js 的 Lambda 函数处理程序

AWS 开发工具包:版本和更新

问题:运行时包含的 AWS 开发工具包不是最新版本

问题:运行时中包含的 AWS 开发工具包自动更新

脚本语言的运行时包括 AWS 开发工具包,并定期更新到最新版本。每个运行时的当前版本在运行时页面上列出。要使用较新版本的AWS开发工具包,或将函数锁定为特定版本,您可以将库与函数代码捆绑起来,或创建 Lambda 层。有关创建具有依赖项的部署程序包的详细信息,请参阅以下主题:

Node.js

使用 .zip 文件归档部署 Node.js Lambda 函数

Python

将 .zip 文件归档用于 Python Lambda 函数

Ruby

使用 .zip 文件归档部署 Ruby Lambda 函数

Java

使用 .zip 或 JAR 文件归档部署 Java Lambda 函数

Go

使用 .zip 文件归档部署 Go Lambda 函数

C#

使用 .zip 文件归档构建和部署 C# Lambda 函数

PowerShell

使用 .zip 文件归档部署 PowerShell Lambda 函数

Python:库未正确加载

问题:(Python) 无法从部署程序包中正确加载某些库

具有使用 C 或 C ++ 编写的扩展模块的库,必须在与 Lambda (Amazon Linux) 具有相同处理器架构的环境中进行编译。有关更多信息,请参阅 将 .zip 文件归档用于 Python Lambda 函数

Java:从 Java 11 更新到 Java 17 后,函数处理事件所需的时间更长

问题:(Java)从 Java 11 更新到 Java 17 后,函数处理事件所需的时间更长

使用 JAVA_TOOL_OPTIONS 参数调整编译器。Java 17 及更高 Java 版本的 Lambda 运行时会更改默认的编译器选项。虽然此更改缩短了寿命较短的函数的冷启动时间,但以前的行为更适合计算密集型、运行时间较长的函数。将 JAVA_TOOL_OPTIONS 设置为 -XX:-TieredCompilation 可恢复到 Java 11 的行为。有关 JAVA_TOOL_OPTIONS 参数的更多信息,请参阅 了解 JAVA_TOOL_OPTIONS 环境变量