

# Lambda 中的部署问题疑难解答
<a name="troubleshooting-deployment"></a>

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

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

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

有关更多故障排除建议和常见支持问题的答案，请访问[AWS知识中心](https://aws.amazon.com/premiumsupport/knowledge-center/#AWS_Lambda)。

有关对 Lambda 应用程序进行调试和故障排除的更多信息，请参阅 Serverless Land 中的 [Debugging](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/debugging-ops)。

**Topics**
+ [常规：权限被拒绝/无法加载此类文件](#troubleshooting-deployment-denied)
+ [常规：调用 UpdateFunctionCode 时出错](#troubleshooting-deployment-updatefunctioncode)
+ [Amazon S3：错误代码 PermanentRedirect。](#troubleshooting-deployment-PermanentRedirect)
+ [常规：找不到、无法加载、无法导入、找不到类、没有此类文件或目录](#troubleshooting-deployment-functionHandler1)
+ [常规：未定义的方法处理程序](#troubleshooting-deployment-functionHandler2)
+ [常规：超出 Lambda 代码存储限制](#troubleshooting-deployment-CodeStorageExceeded)
+ [Lambda：图层转换失败](#troubleshooting-deployment-LayerConversionFailed)
+ [Lambda：InvalidParameterValueException or RequestEntityTooLargeException](#troubleshooting-deployment-InvalidParameterValueException1)
+ [Lambda：InvalidParameterValueException](#troubleshooting-deployment-InvalidParameterValueException2)
+ [Lambda：并发和内存限额](#troubleshooting-deployment-quotas)
+ [Lambda：预置并发的别名配置无效](#troubleshooting-deployment-provisioned-concurrency)

## 常规：权限被拒绝/无法加载此类文件
<a name="troubleshooting-deployment-denied"></a>

**错误：***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 644 <filepath>
```

要在 Windows 中更改文件权限，请参阅 Microsoft Windows 文档中的 [Set, View, Change, or Remove Permissions on an Object](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc731667(v=ws.10))。

**注意**  
如果您不向 Lambda 授予访问部署包中目录所需的权限，Lambda 会将这些目录的权限设置为 755（rwxr-xr-x）。

## 常规：调用 UpdateFunctionCode 时出错
<a name="troubleshooting-deployment-updatefunctioncode"></a>

**错误：***An error occurred (RequestEntityTooLargeException) when calling the UpdateFunctionCode operation*（在调用 UpdateFunctionCode 操作时出错 (RequestEntityTooLargeException)）

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

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

## Amazon S3：错误代码 PermanentRedirect。
<a name="troubleshooting-deployment-PermanentRedirect"></a>

**错误：***Error occurred while GetObject.（GetObject 时发生错误。） S3 错误代码：PermanentRedirect。S3 错误消息：存储桶位于此区域中：us-east-2。请使用此区域重试请求*

当您从 Amazon S3 存储桶上载函数的部署包时，存储桶必须与函数位于同一区域。当您在 [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html) 调用中指定 Amazon S3 对象或在 AWS CLI 或 AWS SAM CLI 中使用程序包并部署命令时，可能会出现此问题。为您在其中开发应用程序的每个区域创建部署构件存储桶。

## 常规：找不到、无法加载、无法导入、找不到类、没有此类文件或目录
<a name="troubleshooting-deployment-functionHandler1"></a>

**错误：***找不到模块“function”*

**错误：***cannot load such file -- function*（无法加载此文件 – 函数）

**错误：***无法导入模块“function”*

**错误：***找不到类：function.Handler*

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

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

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

## 常规：未定义的方法处理程序
<a name="troubleshooting-deployment-functionHandler2"></a>

**错误：***index.handler 未定义或未导出*

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

**错误：***undefined method `handler' for \$1<LambdaHandler:0x000055b76ccebf98>*（\$1<LambdaHandler:0x000055b76ccebf98> 的未定义的方法“handler”）

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

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

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

对于某些语言，Lambda 提供了包含接口的库，该接口需要具有特定名称的处理程序方法。有关每种语言的处理程序命名的详细信息，请参阅以下主题。
+ [使用 Node.js 构建 Lambda 函数](lambda-nodejs.md)
+ [使用 Python 构建 Lambda 函数](lambda-python.md)
+ [使用 Ruby 构建 Lambda 函数](lambda-ruby.md)
+ [使用 Java 构建 Lambda 函数](lambda-java.md)
+ [使用 Go 构建 Lambda 函数](lambda-golang.md)
+ [使用 C\$1 构建 Lambda 函数](lambda-csharp.md)
+ [使用 PowerShell 构建 Lambda 函数](lambda-powershell.md)

## 常规：超出 Lambda 代码存储限制
<a name="troubleshooting-deployment-CodeStorageExceeded"></a>

**错误：***超出代码存储限制。*

Lambda 将函数代码存储在您账户私有的内部 S3 存储桶中。每个 AWS 账户在每个区域分配 75 GB 存储空间。代码存储包括 Lambda 函数和层使用的总存储空间。如果您达到配额，在尝试部署新函数时会收到 *CodeStorageExceededException*。

通过清理旧版本的函数、删除未使用的代码或使用 Lambda 层来管理可用的存储空间。此外，最好[为单独的工作负载使用单独的 AWS 账户](concepts-application-design.md#multiple-accounts)来帮助管理存储配额。

您可以在 Lambda 控制台的**控制面板**子菜单下查看总存储使用量：

![\[监控可观测性图 26\]](http://docs.aws.amazon.com/zh_cn/lambda/latest/dg/images/monitoring-observability-figure-26.png)




## Lambda：图层转换失败
<a name="troubleshooting-deployment-LayerConversionFailed"></a>

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

当您使用图层配置 Lambda 函数时，Lambda 会将该层与您的函数代码合并。如果此过程无法完成，Lambda 会返回此错误。如果遭遇此错误，请执行以下步骤：
+ 从图层中删除所有未使用的文件
+ 删除图层中的所有符号链接
+ 重命名任何与函数层中目录同名的文件

## Lambda：InvalidParameterValueException or RequestEntityTooLargeException
<a name="troubleshooting-deployment-InvalidParameterValueException1"></a>

**错误：***InvalidParameterValueException: Lambda was unable to configure your environment variables because the environment variables you have provided exceeded the 4KB limit.（InvalidParameterValueException：Lambda 无法配置您的环境变量，因为您提供的环境变量超过了 4KB 限制。） 测量的字符串：\$1"A1":"uSFeY5cyPiPn7AtnX5BsM...*

**错误：***RequestEntityTooLargeException：对 UpdateFunctionConfiguration 操作的请求必须小于 5120 字节*

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

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

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

## Lambda：InvalidParameterValueException
<a name="troubleshooting-deployment-InvalidParameterValueException2"></a>

**错误：***InvalidParameterValueException: Lambda 无法配置您的环境变量，因为您提供的环境变量包含目前不支持修改的保留键。*

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

## Lambda：并发和内存限额
<a name="troubleshooting-deployment-quotas"></a>

**Error:*** Specified ConcurrentExecutions for function decreases account's UnreservedConcurrentExecution below its minimum value*（错误：为函数指定的 ConcurrentExecutions 会导致账户的 UnreservedConcurrentExecution 降至其最小值以下）

**Error:*** 'MemorySize' value failed to satisfy constraint: Member must have value less than or equal to 3008*（错误：“内存大小”值不满足约束条件：成员的值必须小于或等于 3008）

超出您账户的并发或内存[限额](gettingstarted-limits.md)时，就会出现这些错误。新的 AWS 账户减少了并发和内存配额。若要解决与并发相关的错误，您可以[请求增加配额](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html)。您无法请求增加配额。
+ **并发：**如果您尝试使用预留或预配置并发创建函数，或者如果您的每函数并发请求（[PutFunctionConcurrency](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionConcurrency.html)）超出您账户的并发限额，则可能会收到错误。
+ **内存：**如果分配给函数的内存量超过您账户的内存限额，则会出现错误。

## Lambda：预置并发的别名配置无效
<a name="troubleshooting-deployment-provisioned-concurrency"></a>

**错误：***预置并发的别名配置无效*

当您尝试更新 Lambda 函数的代码或配置，而具有预置并发的别名指向存在问题的版本时，就会发生这种错误。Lambda 会预先为预置并发初始化执行环境，如果这些环境由于代码错误、资源限制或受影响的堆栈和别名而无法正确初始化，则部署将失败。如果遭遇此问题，请执行以下步骤：

1. **回滚别名：**临时更新别名指向之前正常工作的版本。

   ```
    aws lambda update-alias \
     --function-name <function-name> \
     --name <alias-name> \
     --function-version <known-good-version>
   ```

1. **修复 Lambda 初始化代码：**确保在处理程序外运行的初始化代码没有任何未捕获的异常，并初始化客户端和连接。

1. **重新部署安全：**部署固定的代码并发布新版本。然后，更新别名指向固定版本。（可选）必要时可重新启用[预置并发](provisioned-concurrency.md)。

如果使用 AWS CloudFormation，请更新堆栈定义 `FunctionVersion:!GetAtt version.Version`，使别名指向正常工作的版本：

```
alias:
 Type: AWS::Lambda::Alias
 Properties:
 FunctionName: !Ref function
FunctionVersion: !GetAtt version.Version
 Name: BLUE
 ProvisionedConcurrencyConfig:
 ProvisionedConcurrentExecutions: 1
```