

# 使用层管理 Lambda 依赖项
<a name="chapter-layers"></a>

Lambda 层是包含补充代码或数据的 .zip 文件存档。层通常包含库依赖项、[自定义运行时系统](runtimes-custom.md)或配置文件。

您可能会基于很多原因考虑使用层：
+ **减小部署包的大小。**与其将所有函数依赖项和函数代码都包含在部署包中，不如将其放在一个层中。这样可以减小部署包的大小并对其进行组织。
+ **分离核心函数逻辑与依赖项。**借助层，您无需使用函数代码即可更新函数依赖项，反之亦然。这有助于将二者分离，并帮助您专注于函数逻辑。
+ **在多个函数之间共享依赖项。**创建层后，您可以将其应用到账户中任意数量的函数。如果没有层，则需要在每个单独的部署包中包含相同的依赖项。
+ **使用 Lambda 控制台代码编辑器。**代码编辑器是快速测试次要功能代码更新的得力工具。但是，如果部署包过大，则无法使用编辑器。使用层可以减小部署包的大小，并解锁代码编辑器的用法。
+ **锁定嵌入式 SDK 版本。**随着 AWS 发布新服务和功能，嵌入式 SDK 可能会更改，恕不另行通知。您可以通过[创建具有所需特定版本的 Lambda 层](#chapter-layers)锁定 SDK 版本。然后，即使服务中嵌入的版本更改，该函数也始终使用层中的版本。

如果您在 Go 或 Rust 中使用 Lambda 函数，我们建议不要使用层。对于 Go 和 Rust 函数，您可以将函数代码作为可执行文件提供，其中包括编译后的函数代码及其所有依赖项。将依赖项放在层中会迫使函数在初始化阶段手动加载其他程序集，而这可能会增加冷启动时间。为了让 Go 和 Rust 函数获得最佳性能，请在部署包中加入依赖项。

下图说明了共享依赖项的两个函数之间的高级架构差异。一个使用 Lambda 层，另一个不使用。

![\[\]](http://docs.aws.amazon.com/zh_cn/lambda/latest/dg/images/lambda-layers-diagram.png)


当您向函数添加层时，Lambda 会将层内容提取到函数[执行环境](lambda-runtime-environment.md)中的 `/opt` 目录中。所有原生支持的 Lambda 运行时系统都包含 `/opt` 目录中特定目录的路径。因而函数可以访问层内容。有关这些特定路径以及如何正确打包层的更多信息，请参阅 [打包层内容](packaging-layers.md)。

每个函数最多可以包含五个层。此外，您只能在将 Lambda 函数[部署为 .zip 文件存档](configuration-function-zip.md)的情况下使用层。对于[定义为容器映像](images-create.md)的函数，您可以在创建容器映像时打包首选运行时系统和所有代码依赖项。有关更多信息，请参阅AWS计算博客上的[在容器镜像中使用 Lambda 层和扩展](https://aws.amazon.com/blogs/compute/working-with-lambda-layers-and-extensions-in-container-images/)。

**Topics**
+ [

## 如何使用层
](#lambda-layers-overview)
+ [

## 层和层版本
](#lambda-layer-versions)
+ [

# 打包层内容
](packaging-layers.md)
+ [

# 在 Lambda 中创建和删除层
](creating-deleting-layers.md)
+ [

# 向函数添加层
](adding-layers.md)
+ [

# 与层结合使用 AWS CloudFormation
](layers-cfn.md)
+ [

# 与层结合使用 AWS SAM
](layers-sam.md)

## 如何使用层
<a name="lambda-layers-overview"></a>

要创建层，请将依赖项打包到.zip 文件中，类似于[创建常规部署包](configuration-function-zip.md)的方式。更具体地说，创建和使用层的一般过程包括以下三个步骤：
+ **首先，打包层内容。**这需要创建 .zip 文件存档。有关更多信息，请参阅 [打包层内容](packaging-layers.md)。
+ **接下来，在 Lambda 中创建层。**有关更多信息，请参阅 [在 Lambda 中创建和删除层](creating-deleting-layers.md)。
+ **向函数添加层。**有关更多信息，请参阅 [向函数添加层](adding-layers.md)。

## 层和层版本
<a name="lambda-layer-versions"></a>

层版本是层的特定版本的不可变快照。当您创建新层时，Lambda 会创建一个版本号为 1 的新的层版本。每次向层发布更新时，Lambda 都会递增版本号并创建新的层版本。

每个层版本均由一个 Amazon 资源名称（ARN）进行唯一标识。向函数添加层时，必须指定要使用的确切的层版本（例如，`arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1`）。

# 打包层内容
<a name="packaging-layers"></a>

Lambda 层是包含补充代码或数据的 .zip 文件存档。层通常包含库依赖项、[自定义运行时系统](runtimes-custom.md)或配置文件。

本部分介绍如何正确打包层内容。有关层的更多概念性信息以及您可能会考虑使用层的原因，请参阅 [使用层管理 Lambda 依赖项](chapter-layers.md)。

创建层的第一步是将所有层内容捆绑到.zip 文件存档中。由于 Lambda 函数在 [Amazon Linux](https://docs.aws.amazon.com/linux/al2023/ug/what-is-amazon-linux.html) 上运行，因此层内容必须能够在 Linux 环境中编译和构建。

为确保层内容在 Linux 环境中正常运行，建议使用 [Docker](https://docs.docker.com/get-docker) 等工具创建层内容。

**Topics**
+ [

## 每个 Lambda 运行时的层路径
](#packaging-layers-paths)

## 每个 Lambda 运行时的层路径
<a name="packaging-layers-paths"></a>

当您向函数添加层时，Lambda 会将层内容加载到该执行环境的 `/opt` 目录中。对于每个 Lambda 运行时系统，`PATH` 变量都包括 `/opt` 目录中的特定文件夹路径。为确保 Lambda 能够获取层内容，层 .zip 文件应在以下任何一个文件夹路径中具有依赖项：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/lambda/latest/dg/packaging-layers.html)

以下示例显示了如何构建层 .zip 存档中的文件夹架构。

------
#### [ Node.js ]

**Example 适用于 Node.js 的 AWS X-Ray 软件开发工具包的文件结构**  

```
xray-sdk.zip
└ nodejs/node_modules/aws-xray-sdk
```

------
#### [ Python ]

**Example**  

```
python/              # Required top-level directory
└── requests/
└── boto3/
└── numpy/
└── (dependencies of the other packages)
```

------
#### [ Ruby ]

**Example JSON gem 的文件结构**  

```
json.zip
└ ruby/gems/3.4.0/
               | build_info
               | cache
               | doc
               | extensions
               | gems
               | └ json-2.1.0
               └ specifications
                 └ json-2.1.0.gemspec
```

------
#### [ Java ]

**Example Jackson JAR 文件的文件结构**  

```
layer_content.zip
└ java
    └ lib
        └ jackson-core-2.17.0.jar
        └ <other potential dependencies>
        └ ...
```

------
#### [ All ]

**Example JQ 库的文件结构**  

```
jq.zip
└ bin/jq
```

------

有关打包、创建和添加层的特定语言说明，请参阅以下页面：
+ **Node.js** – [使用 Node.js Lambda 函数的层](nodejs-layers.md)
+ **Python** – [使用 Python Lambda 函数的层](python-layers.md)
+ **Ruby** – [使用 Ruby Lambda 函数的层](ruby-layers.md)
+ **Java** - [使用 Java Lambda 函数的层](java-layers.md)

**不**建议使用层来管理用 Go 和 Rust 编写的 Lambda 函数的依赖项。这是因为用这些语言编写的 Lambda 函数编译成单个可执行文件，您在部署函数时将其提供给 Lambda。这个可执行文件包含您编译的函数代码及其所有依赖项。使用层不仅会使此过程复杂化，还会导致冷启动时间增加，因为函数需要在初始化阶段将额外的程序集手动加载到内存中。

要在 Go 和 Rust Lambda 函数中使用外部依赖项，请直接将其包含在部署包中。

# 在 Lambda 中创建和删除层
<a name="creating-deleting-layers"></a>

Lambda 层是包含补充代码或数据的 .zip 文件存档。层通常包含库依赖项、[自定义运行时系统](runtimes-custom.md)或配置文件。

本部分介绍如何在 Lambda 中创建和删除层。有关层的更多概念性信息以及您可能会考虑使用层的原因，请参阅 [使用层管理 Lambda 依赖项](chapter-layers.md)。

[打包层内容](packaging-layers.md)完成后，下一步是在 Lambda 中创建层。本部分演示如何仅使用 Lambda 控制台或 Lambda API 创建和删除层。要使用 AWS CloudFormation 创建层，请参阅 [与层结合使用 AWS CloudFormation](layers-cfn.md)。要使用 AWS Serverless Application Model（AWS SAM）创建层，请参阅 [与层结合使用 AWS SAM](layers-sam.md)。

**Topics**
+ [

## 创建层
](#layers-create)
+ [

## 删除层版本
](#layers-delete)

## 创建层
<a name="layers-create"></a>

您可以从本地计算机或 Amazon Simple Storage Service（Amazon S3）上传 .zip 文件存档。设置函数的执行环境时，Lambda 将图层内容提取到 `/opt` 目录。

层可以有一个或多个[层版本](chapter-layers.md#lambda-layer-versions)。创建层时，Lambda 将层版本设置为版本 1。您可以随时更改现有层版本的权限。但是，要更新代码或进行其他配置更改，必须创建该层的新版本。

**创建层（控制台）**

1. 打开 Lambda 控制台的 [Layers page](https://console.aws.amazon.com/lambda/home#/layers)（层页面）。

1. 选择 **Create layer**（创建层）。

1. 在 **Layer configuration**（层配置）下，在 **Name**（名称）中，输入层的名称。

1. （可选）对于 **Description**（描述），输入对层的描述。

1. 要上载层代码，请执行以下操作之一：
   + 要从电脑上传 .zip 文件，请选择 **Upload a .zip file**（上传 .zip 文件）。然后，选择 **Upload**（上载）以选择本地 .zip 文件。
   + 要从 Simple Storage Service（Amazon S3）上传文件，请选择 **Upload a file from Amazon S3** [从 Simple Storage Service（Amazon S3）上传文件]。然后，对于 **Amazon S3 link URL**（Simple Storage Service (Amazon S3) 链接 URL），输入文件的链接。

1. （可选）对于**兼容架构**，选择一个值或两个值。有关更多信息，请参阅 [为 Lambda 函数选择和配置指令集架构](foundation-arch.md)。

1. （可选）对于**兼容的运行时系统**，选择与层兼容的运行时系统。

1. （可选）对于 **License**（许可证），输入任何必要的许可证信息。

1. 选择**创建**。

或者，您可以运行 [publish-layer-version](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/publish-layer-version.html) AWS Command Line Interface（CLI）命令。示例：

```
aws lambda publish-layer-version --layer-name my-layer --zip-file fileb://layer.zip --compatible-runtimes python3.14
```

每次运行 `publish-layer-version` 时，Lambda 都将创建一个新[版本的层](chapter-layers.md#lambda-layer-versions)。

## 删除层版本
<a name="layers-delete"></a>

要删除层版本，请使用 [DeleteLayerVersion](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteLayerVersion.html) API 操作。例如，运行 [delete-layer-version](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/delete-layer-version.html) AWS CLI 命令并指定层名称和层版本。

```
aws lambda delete-layer-version --layer-name my-layer --version-number 1
```

删除一个层版本后，您无法再将 Lambda 函数配置为使用该层版本。但是，已使用此版本的任何函数仍能访问它。此外，Lambda 绝不会重用版本号作为层名称。

在计算[配额](gettingstarted-limits.md)时，删除层版本意味着它不再计入默认的 75 GB 函数和层存储配额中。但是，对于消耗已删除层版本的函数，层内容仍计入函数的部署包大小配额（即 .zip 文件存档为 250 MB）。

# 向函数添加层
<a name="adding-layers"></a>

Lambda 层是包含补充代码或数据的 .zip 文件存档。层通常包含库依赖项、[自定义运行时系统](runtimes-custom.md)或配置文件。

本部分介绍如何向 Lambda 函数添加层。有关层的更多概念性信息以及您可能会考虑使用层的原因，请参阅 [使用层管理 Lambda 依赖项](chapter-layers.md)。

在将 Lambda 函数配置为使用层之前，您必须：
+ [打包层内容](packaging-layers.md)
+ [在 Lambda 中创建层](creating-deleting-layers.md)
+ 确保您拥有对层版本调用 [GetLayerVersion](https://docs.aws.amazon.com/lambda/latest/api/API_GetLayerVersion.html) API 的权限。对于 AWS 账户 中的函数，您必须在[用户策略](access-control-identity-based.md)中拥有此权限。要在另一个账户中使用层，该账户的拥有者必须在[基于资源的策略](access-control-resource-based.md)中授予您的账户权限。有关示例，请参阅 [向其他账户授予 Lambda 层访问权限](permissions-layer-cross-account.md)。

您最多可以在 Lambda 函数中添加五个层。函数和所有层的总解压缩大小不能超出 250 MB 的解压缩部署程序包大小配额。有关更多信息，请参阅 [Lambda 配额](gettingstarted-limits.md)。

即使在删除该层版本或撤消该层的访问权限后，函数也可以继续使用已添加的任何层版本。但是，您无法创建使用已删除层版本的新函数。

**向函数添加层**

1. 打开 Lamba 控制台的[函数](https://console.aws.amazon.com/lambda/home#/functions)页面。

1. 选择函数。

1. 向下滚动到**层**部分，然后选择**添加层**。

1. 在**选择层**下，选择一个层源：

   1. **AWS 层**：从 [AWS 托管扩展](extensions-api-partners.md#aws-managed-extensions)列表中进行选择。

   1. **自定义层**：选择在您的 AWS 账户中创建的层。

   1. **指定 ARN**：要使用[其他 AWS 账户](permissions-layer-cross-account.md)的层（例如[第三方扩展](extensions-api-partners.md)），请输入 Amazon 资源名称（ARN）。

1. 选择**添加**。

添加层的顺序就是 Lambda 将层内容合并到执行环境中的顺序。您可以使用控制台更改层合并顺序。

**更新函数的层合并顺序（控制台）**

1. 打开 Lamba 控制台的[函数](https://console.aws.amazon.com/lambda/home#/functions)页面。

1. 选择要配置的函数。

1. 在**层**下，选择**编辑**。

1. 选择其中一个图层。

1. 选择**提前合并**或者**稍后合并**以调整层的顺序。

1. 选择**保存**。

层受版本控制。每个层版本的内容都是不可变的。层所有者可以发布新的层版本以提供更新内容。您可以使用控制台更新附加到函数的层版本。

**更新函数的层版本（控制台）**

1. 打开 Lambda 控制台的 [Layers page](https://console.aws.amazon.com/lambda/home#/layers)（层页面）。

1. 选择要为其更新版本的层。

1. 选择**使用此版本的函数**选项卡。

1. 选择要修改的函数，然后选择**编辑**。

1. 从**层版本**中，选择要更改的目标层版本。

1. 选择 **Update functions**（更新函数）。

不能跨 AWS 账户更新函数的层版本。

## 查找层信息
<a name="finding-layer-information"></a>

要查找账户中与函数运行时系统兼容的层，请使用 [ListLayers](https://docs.aws.amazon.com/lambda/latest/api/API_ListLayers.html) API。例如，您可以使用以下 [list-layers](https://docs.aws.amazon.com/cli/latest/reference/lambda/list-layers.html) AWS Command Line Interface（CLI）命令：

```
aws lambda list-layers --compatible-runtime python3.14
```

您应该可以看到类似于如下所示的输出内容：

```
{
    "Layers": [
        {
            "LayerName": "my-layer",
            "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer",
            "LatestMatchingVersion": {
                "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:2",
                "Version": 2,
                "Description": "My layer",
                "CreatedDate": "2025-04-15T00:37:46.592+0000",
                "CompatibleRuntimes": [
                    "python3.14"
                ]
            }
        }
    ]
}
```

要列出账户中的所有层，您可以省略 `--compatible-runtime` 选项。响应详细信息显示了每层的最新版本。

您还可以使用 [ListLayerVersions](https://docs.aws.amazon.com/lambda/latest/api/API_ListLayerVersions.html) API 获取层的最新版本。例如，您可以使用以下 `list-layer-versions` CLI 命令：

```
aws lambda list-layer-versions --layer-name my-layer
```

您应该可以看到类似于如下所示的输出内容：

```
{
    "LayerVersions": [
        {
            "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:2",
            "Version": 2,
            "Description": "My layer",
            "CreatedDate": "2023-11-15T00:37:46.592+0000",
            "CompatibleRuntimes": [
                "java11"
            ]
        },
        {
            "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:1",
            "Version": 1,
            "Description": "My layer",
            "CreatedDate": "2023-11-15T00:27:46.592+0000",
            "CompatibleRuntimes": [
                "java11"
            ]
        }
    ]
}
```

# 与层结合使用 AWS CloudFormation
<a name="layers-cfn"></a>

您可以使用 CloudFormation 创建层并将层与 Lambda 函数关联起来。以下示例模板会创建一个名为 `my-lambda-layer` 的层，并使用**层**属性将该层附加到 Lambda 函数。

在此示例中，模板指定现有 IAM [执行角色](lambda-intro-execution-role.md)的 Amazon 资源名称（ARN）。您也可以使用 CloudFormation [AWS::IAM::Role](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html) 资源在模板中创建新的执行角色。

您的函数不需要任何特殊权限即可使用层。

```
---
Description: CloudFormation Template for Lambda Function with Lambda Layer
Resources:
  MyLambdaLayer:
    Type: AWS::Lambda::LayerVersion
    Properties:
      LayerName: my-lambda-layer
      Description: My Lambda Layer
      Content:
        S3Bucket: amzn-s3-demo-bucket
        S3Key: my-layer.zip
      CompatibleRuntimes:
        - python3.9
        - python3.10
        - python3.11

  MyLambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: my-lambda-function
      Runtime: python3.9
      Handler: index.handler
      Timeout: 10
      Role: arn:aws:iam::111122223333:role/my_lambda_role
      Layers:
        - !Ref MyLambdaLayer
```

# 与层结合使用 AWS SAM
<a name="layers-sam"></a>

您可以使用 AWS Serverless Application Model（AWS SAM）自动在应用程序中创建层。`AWS::Serverless::LayerVersion` 资源类型创建一个层版本，您可以从自己的 Lambda 函数配置中引用该版本。

```
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: AWS SAM Template for Lambda Function with Lambda Layer

Resources:
  MyLambdaLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: my-lambda-layer
      Description: My Lambda Layer
      ContentUri: s3://amzn-s3-demo-bucket/my-layer.zip
      CompatibleRuntimes:
        - python3.9
        - python3.10
        - python3.11

  MyLambdaFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: MyLambdaFunction
      Runtime: python3.9
      Handler: app.handler
      CodeUri: s3://amzn-s3-demo-bucket/my-function
      Layers:
        - !Ref MyLambdaLayer
```