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

Lambda 中的调用问题疑难解答

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

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

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

IAM:lambda:InvokeFunction 未授权

错误:用户:arn:aws-cn:iam::123456789012:user/developer 未获得授权,无法对资源执行:lambda:InvokeFunction:my-function

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

注意

与 Lambda 中的其他 API 操作不同,IAM 操作 (lambda:InvokeFunction) 的名称与用于调用函数的 API 操作 (Invoke) 的名称不匹配。

有关更多信息,请参阅 Amazon Lambda 权限

Lambda:无法执行操作 ResourceConflictException

错误:ResourceConflictException:此时无法执行该操作。该函数目前处于以下状态:待定

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

有关更多信息,请参阅 使用 Lambda API 监控函数的状态

Lambda:函数卡在待处理状态

错误: 一个函数卡在 Pending 状态达几分钟。

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

Lambda 取消处于暂停状态的操作并将函数置于 Failed 状态。然后,您可以删除该函数并重新创建它,或尝试其他更新。

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

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

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

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

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

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

常规:函数调用正在循环

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

当您的函数在触发它的同一 Amazon 服务中管理资源时,通常会发生这种情况。例如,可以创建一个函数来将对象存储在 Amazon Simple Storage Service (Amazon S3) 存储桶中,该存储桶配置了一个再次调用函数的通知。要使函数停止运行,请在函数配置页面上选择 Throttle (限制)。然后,确定导致递归调用的代码路径或配置错误。

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

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

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

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

    注意

    $LATEST 版本 无法配置预置并发。

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

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

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

注意

存在一个已知的问题:即使没有发生冷启动,在初始化的执行环境中进行首次调用也会在 CloudWatch Logs 中报告非零的 Init Duration 指标。我们正在开发一个修复程序来更正报告到 CloudWatch Logs 的问题。

Lambda:预置并发的延迟变化

问题:启用预置并发后,首次调用时会发生延迟变化。

根据函数的运行时和内存配置,在初始化的执行环境中首次调用时可能会发生一些延迟变化。例如,.NET 和其他 JIT 运行时可能会在首次调用时延迟加载资源,从而导致某些延迟变化(通常为数十毫秒)。这种变化在 128-MiB 函数上更为明显。您可以通过增加函数的配置内存来缓解这种情况。

Lambda:新版本的冷启动问题

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

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

错误:KMSDisabledException:Lambda无法解密环境变量,因为使用的 KMS 密钥已被禁用。请检查功能的 KMS 密钥设置。

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

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

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

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

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

错误:EFSMountConnectivityException:函数无法使用访问点 arn:aws-cn:elasticfilesystem:us-east-2:123456789012:access-point/fsap-015cxmplb72b405fd 连接到 Amazon EFS 文件系统。检查您的网络配置,然后重试。

函数无法使用 NFS 协议(TCP 端口 2049)与函数的文件系统建立连接。检查 VPC 子网的安全组和路由配置

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

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

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

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

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

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