

# 使用层管理 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}}`）。