

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

# 使用層管理 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_tw/lambda/latest/dg/images/lambda-layers-diagram.png)


將層新增至 Lambda 函數時，Lambda 會將層內容擷取至函數[執行環境](lambda-runtime-environment.md)中的 `/opt` 目錄。所有原生支援的 Lambda 執行期皆包含 `/opt` 目錄中特定目錄的路徑。如此一來，您的函數便可以存取您的層內容。如需有關這類特定路徑以及如何正確封裝層的詳細資訊，請參閱 [封裝層內容](packaging-layers.md)。

每個函數最多可包含五個圖層。此外，您只能將層與 [部署為 .zip 封存檔](configuration-function-zip.md) 的 Lambda 函數搭配使用。對於[定義為容器映像](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 Resource Name (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_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 函式中使用外部相依項，請將其直接包含在部署套件中。

# 在 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 主控台中的 [層頁面](https://console.aws.amazon.com/lambda/home#/layers)。

1. 選擇 **建立圖層**。

1. 在 **Layer configuration** (圖層組態) 下，為 **Name** (名稱) 輸入圖層的名稱。

1. (選用) 在 **Description (說明)** 中，輸入 Layer 的說明。

1. 若要上傳 Layer 程式碼，請執行下列其中一個動作：
   + 若要從電腦上傳 .zip 檔案，請選擇 **Upload a .zip file** (上傳 .zip 檔案)。然後，選擇 **Upload** (上傳) 以選取您的本機 .zip 檔案。
   + 若要從 Amazon S3 上傳檔案，請選擇 **Upload a file from Amazon S3** (從 Amazon S3 上傳檔案)。然後，對於 **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 操作。例如，以指定的 layer 名稱和 layer 版本執行 [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. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇函式。

1. 向下捲動至**層**區段，然後選擇**新增層**。

1. 在**選擇層**下方選擇層來源：

   1. **AWS layer**：從 [AWS受管擴充功能](extensions-api-partners.md#aws-managed-extensions)清單中選擇。

   1. **自訂層**：選擇在您 AWS 帳戶中建立的層。

   1. **指定 ARN**：若要使用[來自不同 AWS 帳戶](permissions-layer-cross-account.md) 的 layer，例如[第三方延伸](extensions-api-partners.md)模組，請輸入 Amazon Resource Name (ARN)。

1. 選擇**新增**。

新增層的順序即 Lambda 將層內容合併至執行環境的順序。您可以使用主控台來變更層合併順序。

**若要更新函數的層合併順序 (主控台)**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇要設定的函數。

1. 在 **Layers** (層) 下方，選擇 **Edit** (編輯)

1. 選擇其中一個層。

1. 選擇 **Merge earlier** (先前合併) 或 **Merge later** (稍後合併) 來調整層的順序。

1. 選擇**儲存**。

層已設定版本控制。每個層版本的內容都是不可變的。層擁有者可發行新的層版本，以提供更新內容。您可以使用主控台來更新函數附加的層版本。

**若要更新函數的層版本 (主控台)**

1. 開啟 Lambda 主控台中的[層頁面](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` 的層，並使用 **Layers** 屬性將該層連接至 Lambda 函數。

在此範例中，範本指定現有 IAM [執行角色](lambda-intro-execution-role.md)的 Amazon Resource Name (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
```