在 中建置 Lambda 層 AWS SAM - AWS Serverless Application Model

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

在 中建置 Lambda 層 AWS SAM

您可以使用 AWS SAM 建置自訂 Lambda 層。Lambda 層可讓您從 Lambda 函數擷取程式碼,然後可在多個 Lambda 函數之間重複使用。僅建置 Lambda 層 (而不是建置整個應用程式) 可以透過幾種方式為您帶來好處。它可協助您減少部署套件的大小、將核心函數邏輯與相依性分開,並允許您跨多個函數共用相依性。如需層的相關資訊,請參閱《 AWS Lambda 開發人員指南》中的 AWS Lambda 層

如何在 中建置 Lambda 層 AWS SAM

注意

您必須先在 AWS SAM 範本中寫入 Lambda 層,才能建置 Lambda 層。如需執行此操作的相關資訊和範例,請參閱 使用 Lambda 層搭配 提高效率 AWS SAM

若要建置自訂 layer,請在您的 AWS Serverless Application Model (AWS SAM) 範本檔案中宣告它,並使用BuildMethod項目包含Metadata資源屬性區段。的有效值BuildMethodAWS Lambda 執行時間的識別符,或 makefile。包含BuildArchitecture項目以指定 layer 支援的指令集架構。的有效值BuildArchitectureLambda 指令集架構

如果您指定 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 中包含程式庫相依性

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

Metadata: BuildMethod: python3.12 BuildArchitecture: arm64
注意

如果您未包含Metadata資源屬性區段, AWS SAM 則不會建置 layer。反之,它會從 layer 資源CodeUri屬性中指定的位置複製建置成品。如需詳細資訊,請參閱 AWS::Serverless::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。

範例

範本範例 1:根據 Python 3.12 執行時間環境建置 layer

下列範例 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

下列範例 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

範例 sam 建置命令

下列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