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

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

Lambda 中的部署问题疑难解答

更新函数时,Lambda 使用更新的代码或设置来启动函数的新实例,从而部署更改。部署错误会阻止新版本的使用,并可能由于部署程序包、代码、权限或工具中的问题而引起。

当您使用 Lambda API 或客户端(如 Amazon CLI)将更新直接部署到函数时,您可以直接在输出中查看 Lambda 中的错误。如果您使用 Amazon CloudFormation、Amazon CodeDeploy 或 Amazon CodePipeline 等服务,请在该服务的日志或事件流中查找来自 Lambda 的响应。

以下主题为您在使用 Lambda API、控制台或工具时可能遇到的错误和问题提供故障排除建议。如果您发现某个问题未在此处列出,可以使用此页上的 Feedback 按钮来报告。

有关更多故障排除建议和常见支持问题的答案,请访问Amazon知识中心

有关对 Lambda 应用程序进行调试和故障排除的更多信息,请参阅 Serverless Land 中的 Debugging

常规:权限被拒绝/无法加载此类文件

错误:EACCES: permission denied, open '/var/task/index.js'(EACCES: 权限被拒绝,打开“/var/task/index.js”)

错误:cannot load such file -- function(无法加载此文件 – 函数)

错误:[Errno 13] Permission denied: '/var/task/function.py'([Errno 13] 权限被拒绝:“/var/task/function.py”)

Lambda 运行时需要权限才能读取部署包中的文件。在 Linux 权限八进制表示法中,Lambda 需要对不可执行文件(rw-r--r--)有 644 个权限,目录和可执行文件需要 755 个权限()。rwxr-xr-x

在 Linux 和 MacOS 中,使用 chmod 命令更改部署包中文件和目录的文件权限。例如,要为可执行文件提供正确的权限,请运行以下命令。

chmod 755 <filepath>

要在 Windows 中更改文件权限,请参阅 Microsoft Windows 文档中的 Set, View, Change, or Remove Permissions on an Object

常规:调用时出错 UpdateFunctionCode

错误:调用 UpdateFunctionCode操作时出现错误 (RequestEntityTooLargeException)

在将部署包或层归档直接上载到 Lambda 时,ZIP 文件的大小最多为 50 MB。要上载一个较大的文件,请将此文件存储在 Amazon S3 中并使用 S3Bucket 和 S3Key 参数。

注意

当您直接使用 Amazon CLI、Amazon 开发工具包或通过其他方式上传文件时,二进制 ZIP 文件将转换为 base64,其大小将增加约 30%。为了支持这一点以及请求中其他参数的大小,Lambda 应用的实际请求大小限制会更大。因此,50 MB 的限制是近似值。

亚马逊 S3:错误代码 PermanentRedirect。

错误:错误发生在 GetObject。S3 错误代码: PermanentRedirect. S3 错误消息:存储桶位于此区域中:us-east-2。请使用此区域重试请求

当您从 Amazon S3 存储桶上载函数的部署包时,存储桶必须与函数位于同一区域。当您在调用中指定 Amazon S3 对象 UpdateFunctionCode,或者在Amazon CLI或 Amazon SAM CLI 中使用软件包并部署命令时,可能会出现此问题。为您在其中开发应用程序的每个区域创建部署构件存储桶。

常规:找不到、无法加载、无法导入、找不到类、没有此类文件或目录

错误:找不到模块“function”

错误:cannot load such file -- function(无法加载此文件 – 函数)

错误:无法导入模块“function”

错误:找不到类:function.Handler

错误:fork/exec/var/task/function:没有这样的文件或目录

错误:无法从程序集“Function”加载类型“Function.Handler”。

函数处理程序配置中文件或类的名称与您的代码不匹配。有关更多信息,请参阅以下部分。

常规:未定义的方法处理程序

错误:index.handler 未定义或未导出

错误:模块“function”上缺少处理程序“handler”

错误:#<:0x0000 55b76ccebf98> 的未定义方法 “处理程序” LambdaHandler

错误:在类 function.Handler 上没有找到具有正确方法签名的名为 handleRequest 的公共方法。

错误:Unable to find method 'handleRequest' in type 'Function.Handler' from assembly 'Function'(无法从程序集“Function”的类型“Function.Handler”中找到方法“handleRequest”)

函数处理程序配置中的处理程序方法的名称与您的代码不匹配。每个运行时为处理程序定义一个命名约定,例如 filename.methodname。处理程序是函数代码中的方法,在调用函数时由运行时运行该方法。

对于某些语言,Lambda 提供了包含接口的库,该接口需要具有特定名称的处理程序方法。有关每种语言的处理程序命名的详细信息,请参阅以下主题。

Lambda:图层转换失败

错误:Lambda 图层转换失败。有关解决此问题的建议,请参阅《Lambda 用户指南》中的“排查 Lambda 中的部署问题”页面。

当您使用图层配置 Lambda 函数时,Lambda 会将该层与您的函数代码合并。如果此过程无法完成,Lambda 会返回此错误。如果遭遇此错误,请执行以下步骤:

  • 从图层中删除所有未使用的文件

  • 删除图层中的所有符号链接

  • 重命名任何与函数层中目录同名的文件

Lambda:或 InvalidParameterValueException RequestEntityTooLargeException

错误:InvalidParameterValueException: Lambda 无法配置您的环境变量,因为您提供的环境变量超出了 4KB 的限制。测量的字符串:{"A1":" usFe cyPiPn y5 7atnx5bsm...

错误:RequestEntityTooLargeException: 该操作的请求必须小于 5120 字节 UpdateFunctionConfiguration

存储在函数配置中的变量对象的最大体积不得超过 4096 个字节。这包括密钥名称、值、引号、逗号和括号。HTTP 请求正文的总大小也受到限制。

{ "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs20.x", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Environment": { "Variables": { "BUCKET": "my-bucket", "KEY": "file.txt" } }, ... }

在此示例中,对象为 39 个字符,并且它在存储(不含空格)为字符串 {"BUCKET":"my-bucket","KEY":"file.txt"} 时占用 39 个字节。环境变量值中的每个标准 ASCII 字符使用一个字节。每个扩展 ASCII 和 Unicode 字符可以使用 2 到 4 个字节。

Lambda: InvalidParameterValueException

错误:InvalidParameterValueException: Lambda 无法配置您的环境变量,因为您提供的环境变量包含当前不支持修改的保留密钥

Lambda 会预留一些环境变量键供内部使用。例如,运行时使用 AWS_REGION 来确定当前区域且它不能被覆盖。运行时使用其他变量(如 PATH),但这些变量可以在函数配置中扩展。有关完整列表,请参阅定义运行时环境变量

Lambda:并发和内存限额

错误: ConcurrentExecutions 为函数指定会将账户减至其最小值 UnreservedConcurrentExecution 以下

错误:“MemorySize” 值未能满足约束:成员的值必须小于或等于 3008

超出您账户的并发或内存限额时,就会出现这些错误。新的 Amazon 账户减少了并发和内存配额。若要解决与并发相关的错误,您可以请求增加配额。您无法请求增加配额。

  • 并发:如果您尝试使用预留或预配置并发创建函数,或者如果您的每函数并发请求 (PutFunctionConcurrency) 超出您账户的并发限额,则可能会收到错误。

  • 内存:如果分配给函数的内存量超过您账户的内存限额,则会出现错误。