

# Lambda 中的调用问题疑难解答
<a name="troubleshooting-invocation"></a>

当您调用 Lambda 函数时，Lambda 在将事件发送到函数或（对于异步调用）发送到事件队列之前，先验证请求并检查扩展容量。调用错误可能是由请求参数、事件结构、函数设置、用户权限、资源权限或限制中的问题引起的。

如果您直接调用函数，则会在 Lambda 的响应中看到所有调用错误。如果您使用事件源映射或通过其他服务异步调用函数，则可能会在日志、死信队列或失败事件目标中找到错误。错误处理选项和重试行为因调用函数的方式和错误类型而异。

有关 `Invoke` 操作可以返回的错误类型的列表，请参阅 [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)（调用）。

**Topics**
+ [Lambda：函数在初始化阶段超时 (Sandbox.Timedout)](#troubleshooting-timeouts)
+ [IAM：lambda:InvokeFunction 未授权](#troubleshooting-invocation-noauth)
+ [Lambda：无法找到有效的引导程序 (Runtime.InvalidEntrypoint)](#troubleshooting-invocation-bootstrap)
+ [Lambda：无法执行操作 ResourceConflictException](#troubleshooting-invocation-ResourceConflictException)
+ [Lambda：函数卡在待处理状态](#troubleshooting-invocation-pending)
+ [Lambda：某个函数正在使用所有并发](#troubleshooting-invocation-allconcurrency)
+ [常规：无法使用其他账户或服务调用函数](#troubleshooting-invocation-cannotinvoke)
+ [常规：函数调用正在循环](#troubleshooting-invocation-loop)
+ [Lambda：预置并发的别名路由](#troubleshooting-invocation-alias)
+ [Lambda：预置并发导致的冷启动](#troubleshooting-invocation-coldstart)
+ [Lambda：新版本的冷启动问题](#troubleshooting-invocation-newversion)
+ [Lambda：运行时出现意外的 Node.js 退出情况（Runtime.NodejsExit）](#troubleshooting-invocation-nodejs-exit)
+ [EFS：函数无法挂载 EFS 文件系统](#troubleshooting-invocation-efsmount)
+ [EFS：函数无法连接到 EFS 文件系统](#troubleshooting-invocation-efsconnect)
+ [EFS：由于超时，函数无法挂载 EFS 文件系统](#troubleshooting-invocation-efstimeout)
+ [Lambda：Lambda 检测到某一 IO 进程耗时过长](#troubleshooting-invocation-ioprocess)
+ [容器：CodeArtifactUserException 错误](#troubleshooting-deployment-container-artifact)
+ [容器：InvalidEntrypoint 错误](#troubleshooting-deployment-container-entrypoint)

## Lambda：函数在初始化阶段超时 (Sandbox.Timedout)
<a name="troubleshooting-timeouts"></a>

 **错误：***任务在 3.00 秒后超时* 

如果 [Init](lambda-runtime-environment.md#runtimes-lifecycle-ib) 阶段超时，Lambda 会在下一个调用请求到达时重新运行 `Init` 阶段，以便再次初始化执行环境。此情况称为[隐藏初始化](lambda-runtime-environment.md#suppressed-init)。不过，如果函数配置了较短的[超时时间](configuration-timeout.md)（通常在 3 秒左右），被抑制的初始化可能无法在分配的超时时间内完成，导致 `Init` 阶段再次超时。另一种情况是，被抑制的初始化已完成，但没有留出足够时间让 [Invoke](lambda-runtime-environment.md#runtimes-lifecycle-invoke) 阶段完成，导致 `Invoke` 阶段超时。

要减少超时错误，请使用下列一项或多项策略：
+ **延长函数超时时间**：延长[超时](configuration-timeout.md)时间，让 `Init` 和`Invoke` 阶段有时间成功完成。
+ **增加函数内存分配**：[内存](configuration-memory.md)越多意味着 CPU 分配也会成比例增加，而这可以加快 `Init` 和 `Invoke` 阶段的完成速度。
+ **优化函数初始化代码**：缩短初始化所需的时间，确保 `Init` 和 `Invoke` 阶段可以在配置的超时时间内完成。

## IAM：lambda:InvokeFunction 未授权
<a name="troubleshooting-invocation-noauth"></a>

 **错误：***User: arn:aws:iam::123456789012:user/developer is not authorized to perform: lambda:InvokeFunction on resource: my-function*（用户: arn:aws:iam::123456789012:user/developer 未获得授权，无法对资源执行 lambda:InvokeFunction: my-function） 

您的用户或您代入的角色必须具有调用函数的权限。此要求还适用于 Lambda 函数以及其他调用函数的计算资源。将 AWS 托管式策略 **AWSLambdaRole** 添加到用户或添加允许对目标函数执行 `lambda:InvokeFunction` 操作的自定义策略。

**注意**  
IAM 操作的名称 (`lambda:InvokeFunction`) 指的是 `Invoke` Lambda API 操作。

有关更多信息，请参阅 [在 AWS Lambda 中管理权限](lambda-permissions.md)。

## Lambda：无法找到有效的引导程序 (Runtime.InvalidEntrypoint)
<a name="troubleshooting-invocation-bootstrap"></a>

 **错误：***无法找到有效的引导程序：[/var/task/bootstrap /opt/bootstrap]* 

当部署包的根目录不包含名为 `bootstrap` 的可执行文件时，通常会发生此错误。例如，如果使用 .zip 文件部署函数 `provided.al2023`，则 `bootstrap` 文件必须位于 .zip 文件的根目录下，而不是目录中。

## Lambda：无法执行操作 ResourceConflictException
<a name="troubleshooting-invocation-ResourceConflictException"></a>

 **错误：***ResourceConflictException: The operation cannot be performed at this time.（ResourceConflictException：此时无法执行该操作。） 该函数目前处于以下状态：待定* 

如果在创建时将函数连接到 Virtual Private Cloud (VPC)，则该函数会在 Lambda 创建弹性网络接口时进入 `Pending` 状态。在此期间，您无法调用或修改函数。如果您在创建后将函数连接到 VPC，则可以在更新处于待处理状态时调用该函数，但无法修改其代码或配置。

有关更多信息，请参阅 [Lambda 函数状态](functions-states.md)。

## Lambda：函数卡在待处理状态
<a name="troubleshooting-invocation-pending"></a>

 **错误：***A function is stuck in the `Pending` state for several minutes.*（一个函数卡在待处理状态达几分钟。） 

如果某个函数卡在 `Pending` 状态超过六分钟，请调用以下 API 操作之一来取消阻止它。
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
+ [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html)

Lambda 取消处于暂停状态的操作并将函数置于 `Failed` 状态。然后，您可以尝试另一次更新。

## Lambda：某个函数正在使用所有并发
<a name="troubleshooting-invocation-allconcurrency"></a>

 **问题：***一个函数使用了所有可用的并发，导致其他函数被限制。*

要将 AWS 区域中 AWS 账户的可用并发划分为池，请使用[预留并发](configuration-concurrency.md)。预留并发可确保函数始终可以扩展到向其分配的并发，并且不会扩展到向其分配的并发之外。

## 常规：无法使用其他账户或服务调用函数
<a name="troubleshooting-invocation-cannotinvoke"></a>

 **问题：***您可以直接调用您的函数，但是当另一个服务或账户调用它时，它不会运行。*

您向[其他服务](lambda-services.md)和账户授予权限以在函数的[基于资源的策略](access-control-resource-based.md)中调用函数。如果调用方是另一个账户，则该用户还必须具有[函数调用权限](access-control-identity-based.md)。

## 常规：函数调用正在循环
<a name="troubleshooting-invocation-loop"></a>

 **问题：***函数在循环中被连续调用。*

当您的函数在触发它的同一 AWS 服务中管理资源时，通常会发生这种情况。例如，可以创建一个函数来将对象存储在 Amazon Simple Storage Service (Amazon S3) 存储桶中，该存储桶配置了一个[再次调用函数的通知](with-s3.md)。要将函数停止运行，请将可用的[并发](lambda-concurrency.md)减少到零，以限制未来发生的所有调用。然后，确定导致递归调用的代码路径或配置错误。Lambda 会自动检测并停止某些 AWS 服务和 SDK 的递归循环。有关更多信息，请参阅 [使用 Lambda 递归循环检测来防止无限循环](invocation-recursion.md)。

## Lambda：预置并发的别名路由
<a name="troubleshooting-invocation-alias"></a>

 **问题：***在别名路由期间预配置的并发溢出调用。*

Lambda 使用简单的概率模型在两个函数版本之间分发流量。低流量级别情况下，您可能会看到每个版本上配置的流量百分比与实际流量百分比之间的差异很大。如果您的函数使用预置并发，则可以避免[溢出调用](monitoring-metrics-types.md#invocation-metrics)，方法是在别名路由处于活动状态期间配置更多的预置并发实例。

## Lambda：预置并发导致的冷启动
<a name="troubleshooting-invocation-coldstart"></a>

 **问题：***启用预置并发后，会发生冷启动。*

函数上的并发执行次数少于或等于[配置的预置并发级别](provisioned-concurrency.md)时，应该不会发生冷启动。要帮助您确认预置并发是否正常运行，请执行以下操作：
+  [检查是否在函数版本或别名上启用了预置并发](provisioned-concurrency.md)。
**注意**  
未发布[版本的函数](configuration-versions.md)（\$1LATEST）无法配置预置并发。
+ 确保触发器调用了正确的函数版本或别名。例如，如果您正在使用 Amazon API Gateway，检查确认是 API Gateway 在使用预置并发调用函数版本或别名，而非 \$1LATEST。要确认是否使用了预置并发，您可以检查 [ProvisionedConcurrencyInvocations Amazon CloudWatch 指标](monitoring-concurrency.md#provisioned-concurrency-metrics)。非零值表示函数正在初始化的执行环境中处理调用。
+ 通过检查 [ProvisionedConcurrencySpilloverInvocations Amazon CloudWatch](monitoring-concurrency.md#provisioned-concurrency-metrics) 指标来确定您的函数并发是否超出了配置的预置并发级别。非零值表示所有预置并发都处于使用状态，且在冷启动时发生了部分调用。
+ 检查[调用频率](gettingstarted-limits.md#api-requests)（每秒请求数）。具有预置并发的函数每个预置并发的最大速率为每秒 10 个请求。例如，配置了 100 个预置并发的函数可以每秒处理 1000 个请求。如果调用速率超过每秒 1000 个请求，则可能会发生部分冷启动。

## Lambda：新版本的冷启动问题
<a name="troubleshooting-invocation-newversion"></a>

 **问题：***在部署新版本的函数后，会发生冷启动。*

更新函数别名后，Lambda 会根据别名上配置的权重自动将预置并发转移到新版本。

 **错误：***KMSDisabledException: Lambda was unable to decrypt the environment variables because the KMS key used is disabled.（KMSDisabledException：Lambda 无法解密环境变量，因为使用的 KMS 密钥已被禁用。） 请检查功能的 KMS 密钥设置。*

如果您的 AWS Key Management Service (AWS KMS) 密钥被禁用或者撤销了允许 Lambda 使用该密钥的授权，则可能会发生此错误。如果缺少授权，请将函数配置为使用其他密钥。然后，重新分配自定义密钥以重新创建授权。

## Lambda：运行时出现意外的 Node.js 退出情况（Runtime.NodejsExit）
<a name="troubleshooting-invocation-nodejs-exit"></a>

**问题：***Lambda 运行时客户端检测到意外的 Node.js 退出代码。*

这种错误在您的函数在所有 Promise 均已解决之前就退出时出现，例如因代码漏洞导致。当 Node.js 检测到阻止 Promise 被解决的死锁时，也会发生这种情况。此错误仅影响异步样式处理程序，不影响回调样式处理程序。

**受影响的运行时：**Node.js 18 及更高版本。

**要解决此问题，请执行以下操作：**

1. 检查您的函数代码，看看异步处理程序中是否有未解决的 Promise。

1. 在函数完成之前，请确保所有 Promise 都已妥善解决（已解决或拒绝）。

1. 查看您的代码，以了解其中的异步操作是否存在潜在的竞争条件。

有关 Node.js 退出代码和进程终止的更多信息，请参阅 [Node.js 文档](https://nodejs.org/docs/latest/api/process.html#exit-codes)。

## EFS：函数无法挂载 EFS 文件系统
<a name="troubleshooting-invocation-efsmount"></a>

 **错误：***EFSMountFailureException：函数无法使用访问点 arn:aws:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd 挂载 EFS 文件系统。*

对函数[文件系统](configuration-filesystem.md) 的挂载请求被拒绝。检查函数的权限，并确认其文件系统和访问点存在且可供使用。

## EFS：函数无法连接到 EFS 文件系统
<a name="troubleshooting-invocation-efsconnect"></a>

 **错误：***EFSMountConnectivityException: The function couldn't connect to the Amazon EFS file system with access point arn:aws:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd.（EFSMountConnectivityException：函数无法使用访问点 arn:aws:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd 连接到 Amazon EFS 文件系统。） 检查您的网络配置，然后重试。*

函数无法使用 NFS 协议（TCP 端口 2049）与函数的[文件系统](configuration-filesystem.md)建立连接。检查 VPC 子网的[安全组和路由配置](https://docs.aws.amazon.com/efs/latest/ug/network-access.html)。

如果您在更新函数的 VPC 配置设置后出现这些错误，请尝试卸载并重新挂载文件系统。

## EFS：由于超时，函数无法挂载 EFS 文件系统
<a name="troubleshooting-invocation-efstimeout"></a>

 **错误：***EFSMountTimeoutException：由于挂载超时，函数无法使用访问点 \$1arn:aws:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd\$1 挂载 EFS 文件系统。*

函数能够连接到函数的[文件系统](configuration-filesystem.md)，但挂载操作超时。短时间后再试，并考虑限制函数的[并发](configuration-concurrency.md)以减少文件系统的负载。

## Lambda：Lambda 检测到某一 IO 进程耗时过长
<a name="troubleshooting-invocation-ioprocess"></a>

 *EFSIOException：此函数实例已停止，因为 Lambda 检测到某一 IO 进程花费的时间过长。*

先前的调用超时，且 Lambda 无法终止函数处理程序。当附加的文件系统用完了突发信用并且基准吞吐量不足时，可能会出现此问题。要提高吞吐量，可以增加文件系统的大小或使用预置吞吐量。

## 容器：CodeArtifactUserException 错误
<a name="troubleshooting-deployment-container-artifact"></a>

**错误：***CodeArtifactUserPendingException 错误消息*

CodeArtifact 正在等待优化。当 Lambda 完成优化时，函数将转换为[活动状态](functions-states.md)。HTTP 响应代码：409。

**错误：***CodeArtifactUserDeletedException 错误消息*

计划删除 CodeArtifact。HTTP 响应代码：409。

**错误：***CodeArtifactUserFailedException 错误消息*

Lambda 无法优化代码。您需要更正代码并重新上传。HTTP 响应代码：409。

## 容器：InvalidEntrypoint 错误
<a name="troubleshooting-deployment-container-entrypoint"></a>

**错误：***Runtime.ExitError 或“errorType”：“Runtime.InvalidEntrypoint”*

验证容器映像的 ENTRYPOINT 是否包含作为位置的绝对路径。另外，验证映像不包含作为 ENTRYPOINT 的符号链接。

**错误：** *您正在使用 CloudFormation 模板，并且您的容器 ENTRYPOINT 正被 null 值或空值覆盖。*

查看 CloudFormation 模板中的 [ImageConfig](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-lambda-function-imageconfig.html) 资源。如果在模板中声明 `ImageConfig` 资源，则必须为全部三个属性提供非空值。