

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 封裝層內容
<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_tw/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 函式中使用外部相依項，請將其直接包含在部署套件中。