Lambda 中的调用问题疑难解答 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Lambda 中的调用问题疑难解答

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

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

有关 Invoke 操作可以返回的错误类型的列表,请参阅 Invoke(调用)。

IAM:lambda:InvokeFunction 未授权

错误: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 函数以及其他调用函数的计算资源。将 Amazon 托管式策略 AWSLambdaRole 添加到用户或添加允许对目标函数执行 lambda:InvokeFunction 操作的自定义策略。

注意

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

有关更多信息,请参阅Lambda 资源访问权限

Lambda:无法找到有效的引导程序 (Runtime.InvalidEntrypoint)

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

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

Lambda:无法执行操作 ResourceConflictException

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

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

有关更多信息,请参阅Lambda 函数状态

Lambda:函数卡在待处理状态

错误:A function is stuck in the Pending state for several minutes.(一个函数卡在待处理状态达几分钟。)

如果某个函数卡在 Pending 状态超过六分钟,请调用以下 API 操作之一来取消阻止它。

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

Lambda:某个函数正在使用所有并发

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

要将 Amazon 区域中 Amazon 账户的可用并发划分为池,请使用预留并发。预留并发可确保函数始终可以扩展到向其分配的并发,并且不会扩展到向其分配的并发之外。

常规:无法使用其他账户或服务调用函数

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

您向其他服务和账户授予权限以在函数的基于资源的策略中调用函数。如果调用方是另一个账户,则该用户还必须具有函数调用权限

常规:函数调用正在循环

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

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

Lambda:预置并发的别名路由

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

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

Lambda:预置并发导致的冷启动

问题:启用预置并发后,会发生冷启动。

函数上的并发执行次数少于或等于配置的预置并发级别时,应该不会发生冷启动。要帮助您确认预置并发是否正常运行,请执行以下操作:

  • 检查是否在函数版本或别名上启用了预置并发

    注意

    未发布版本的函数($LATEST)无法配置预置并发。

  • 确保触发器调用了正确的函数版本或别名。例如,如果您正在使用 Amazon API Gateway,检查确认是 API Gateway 在使用预置并发调用函数版本或别名,而非 $LATEST。要确认是否使用了预置并发,您可以检查 ProvisionedConcurrencyInvocations Amazon CloudWatch 指标。非零值表示函数正在初始化的执行环境中处理调用。

  • 通过检查 ProvisionedConcurrencySpilloverInvocations Amazon CloudWatch 指标来确定您的函数并发是否超出了配置的预置并发级别。非零值表示所有预置并发都处于使用状态,且在冷启动时发生了部分调用。

  • 检查调用频率(每秒请求数)。具有预置并发的函数每个预置并发的最大速率为每秒 10 个请求。例如,配置了 100 个预置并发的函数可以每秒处理 1000 个请求。如果调用速率超过每秒 1000 个请求,则可能会发生部分冷启动。

Lambda:新版本的冷启动问题

问题:在部署新版本的函数后,会发生冷启动。

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

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

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

EFS:函数无法挂载 EFS 文件系统

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

对函数文件系统 的挂载请求被拒绝。检查函数的权限,并确认其文件系统和访问点存在且可供使用。

EFS:函数无法连接到 EFS 文件系统

错误: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)与函数的文件系统建立连接。检查 VPC 子网的安全组和路由配置

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

EFS:由于超时,函数无法挂载 EFS 文件系统

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

函数能够连接到函数的文件系统,但挂载操作超时。短时间后再试,并考虑限制函数的并发以减少文件系统的负载。

Lambda:Lambda 检测到某一 IO 进程耗时过长

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

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