本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 中建置 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
資源屬性區段。的有效值BuildMethod
是AWS Lambda 執行時間的識別符,或 makefile
。包含BuildArchitecture
項目以指定 layer 支援的指令集架構。的有效值BuildArchitecture
為 Lambda 指令集架構。
如果您指定 makefile
,請提供自訂 makefile,在此宣告build-
包含 layer 建置命令之格式的建置目標。如有必要,您的 makefile 負責編譯 layer,並將建置成品複製到工作流程中後續步驟所需的適當位置。makefile 的位置是由 layer 資源的 layer-logical-id
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 資源。layer-logical-id
-
做為 Lambda 函數的相依性。當您在相同 AWS SAM 範本檔案中的 Lambda 函數
Layers
屬性中包含 layer 的邏輯 ID 時, layer 是該 Lambda 函數的相依性。當該 layer 也包含具有BuildMethod
項目Metadata
的資源屬性區段時,您可以透過使用sam build
命令建置整個應用程式或使用sam build
命令指定函數資源來建置 layer。function-logical-id
範例
範本範例 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
# Build the 'function-logical-id' resource and layers that this function depends onlayer-logical-id
$
sam build
# Build the entire application, including the layers that any function depends onfunction-logical-id
$
sam build