

# 打包层内容
<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 函数中使用外部依赖项，请直接将其包含在部署包中。