

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

# 在 中建置 Lambda 層 AWS SAM
<a name="building-layers"></a>



您可以使用 AWS SAM 來建置自訂 Lambda 層。Lambda 層可讓您從 Lambda 函數擷取程式碼，然後可在多個 Lambda 函數之間重複使用。僅建置 Lambda 層 （而不是建置整個應用程式） 可以透過幾種方式使您受益。它可協助您減少部署套件的大小、將核心函數邏輯與相依性分開，並允許您在多個函數之間共用相依性。如需層的相關資訊，請參閱《 *AWS Lambda 開發人員指南*》中的 [AWS Lambda 層](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html)。

## 如何在 中建置 Lambda 層 AWS SAM
<a name="w2aac18c23c19c34b7"></a>

**注意**  
您必須先在 AWS SAM 範本中寫入 Lambda 層，才能建置 Lambda 層。如需執行此操作的相關資訊和範例，請參閱 [透過 使用 Lambda 層提高效率 AWS SAM](serverless-sam-cli-layers.md)。

若要建置自訂 layer，請在您的 AWS Serverless Application Model (AWS SAM) 範本檔案中宣告它，並在`BuildMethod`項目中包含`Metadata`資源屬性區段。的有效值`BuildMethod`是[AWS Lambda 執行時間](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)的識別符，或 `makefile`。包含`BuildArchitecture`項目以指定 layer 支援的指令集架構。的有效值`BuildArchitecture`為 [Lambda 指令集架構](https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html)。

如果您指定 `makefile`，請提供自訂 makefile，您可以在其中宣告`build-layer-logical-id`包含 layer 建置命令之表單的建置目標。如有必要，您的 makefile 負責編譯 layer，並將建置成品複製到工作流程中後續步驟所需的適當位置。makefile 的位置是由 layer 資源的 `ContentUri` 屬性指定，且必須命名為 `Makefile`。

**注意**  
當您建立自訂 layer 時， AWS Lambda 取決於環境變數來尋找您的 layer 程式碼。Lambda 執行時間包含 layer 程式碼複製到其中的`/opt`目錄中的路徑。專案的建置成品資料夾結構必須符合執行時間的預期資料夾結構，才能找到您的自訂層程式碼。  
例如，對於 Python，您可以將程式碼放在 `python/`子目錄中。對於 NodeJS，您可以將程式碼放在 `nodejs/node_modules/`子目錄中。  
如需詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的在 [layer 中包含程式庫相依性](https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path)。

以下是範例`Metadata`資源屬性區段。

```
    Metadata:
      BuildMethod: python3.12
      BuildArchitecture: arm64
```

**注意**  
如果您未包含`Metadata`資源屬性區段， AWS SAM 則不會建置 layer。反之，它會從 layer 資源的 `CodeUri` 屬性中指定的位置複製建置成品。如需詳細資訊，請參閱 `AWS::Serverless::LayerVersion` 資源類型的 [ContentUri](sam-resource-layerversion.md#sam-layerversion-contenturi) 屬性。

當您包含`Metadata`資源屬性區段時，您可以使用 `sam build`命令來建置 layer，無論是做為獨立物件，或是做為 AWS Lambda 函數的相依性。
+ ****做為獨立物件。****您可能只想建置 layer 物件，例如，當您在本機測試對 layer 的程式碼變更，而且不需要建置整個應用程式時。若要獨立建置 layer，請使用 `sam build layer-logical-id`命令指定 layer 資源。
+ **做為 Lambda 函數的相依性。**當您在相同 AWS SAM 範本檔案中 Lambda 函數的 `Layers` 屬性中包含 layer 的邏輯 ID 時， layer 是該 Lambda 函數的相依性。當該 layer 也包含具有`BuildMethod`項目`Metadata`的資源屬性區段時，您可以透過使用 `sam build`命令建置整個應用程式或使用 `sam build function-logical-id`命令指定函數資源來建置 layer。

## 範例
<a name="building-applications-examples"></a>

### 範本範例 1：根據 Python 3.12 執行時間環境建置 layer
<a name="building-applications-examples-python"></a>

下列範例 AWS SAM 範本會根據 Python 3.12 執行時間環境建置 layer。

```
Resources:
  MyLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      ContentUri: my_layer
      CompatibleRuntimes:
        - python3.12
    Metadata:
      BuildMethod: python3.12   # Required to have AWS SAM build this layer
```

### 範本範例 2：使用自訂 makefile 建置 layer
<a name="building-applications-examples-makefile"></a>

下列範例 AWS SAM 範本使用自訂 `makefile` 來建置 layer。

```
Resources:
  MyLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      ContentUri: my_layer
      CompatibleRuntimes:
        - python3.12
    Metadata:
      BuildMethod: makefile
```

以下`makefile`包含要執行的建置目標和命令。請注意， `ContentUri` 屬性設定為 `my_layer`，因此 makefile 必須位於 `my_layer` 子目錄的根目錄，且檔案名稱必須為 `Makefile`。另請注意，建置成品會複製到 `python/`子目錄，以便 AWS Lambda 能夠找到 layer 程式碼。

```
build-MyLayer:
  mkdir -p "$(ARTIFACTS_DIR)/python"
  cp *.py "$(ARTIFACTS_DIR)/python"
  python -m pip install -r requirements.txt -t "$(ARTIFACTS_DIR)/python"
```

**注意**  
呼叫 `makefile` 時，會觸發適當的目標，並將成品複製到公開的環境變數 `$ARTIFACTS_DIR`。如需詳細資訊，請參閱 [ GitHub 中的 aws-lambda-builders](https://github.com/aws/aws-lambda-builders/blob/develop/aws_lambda_builders/workflows/custom_make/DESIGN.md)。

### 範例 sam 建置命令
<a name="building-applications-examples-commands"></a>

下列`sam build`命令會建置包含`Metadata`資源屬性區段的層。

```
# Build the 'layer-logical-id' resource independently
$ sam build layer-logical-id
            
# Build the 'function-logical-id' resource and layers that this function depends on
$ sam build function-logical-id

# Build the entire application, including the layers that any function depends on
$ sam build
```