在中建置 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

要構建自定義層,請在 AWS Serverless Application Model (AWS SAM)模板文件中聲明它,並包含帶有BuildMethod條目的Metadata資源屬性部分。的有效值BuildMethodAWS Lambda 執行階段的識別碼,或makefile。包含一個BuildArchitecture項目,以指定您的層支援的指令集架構。的有效值BuildArchitectureLambda 指令集架構

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

注意

創建自定義圖層時, AWS Lambda 取決於環境變量來查找圖層代碼。Lambda 執行階段包括將圖層程式碼複製到的/opt目錄中的路徑。專案的建置成品資料夾結構必須與執行階段預期的資料夾結構相符,才能找到您的自訂圖層程式碼。

例如,對於 Python,您可以將代碼放在python/子目錄中。對於 NodeJS,您可以將代碼放在子目錄中nodejs/node_modules/

如需詳細資訊,請參閱《AWS Lambda 開發人員指南》中的在圖層中包含程式庫相依性

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

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

如果不包含Metadata資源屬性部分,則不 AWS SAM 會構建圖層。而是從圖層資源CodeUri屬性中指定的位置複製組建加工品。如需詳細資訊,請參閱AWS::Serverless::LayerVersion資源類型的ContentUri內容。

當您包括資Metadata源屬性區段時,您可以使用sam build指令將圖層建置為獨立物件或 AWS Lambda 函數的相依性。

  • 作為一個獨立的對象。您可能只想要建置圖層物件,例如當您在本機測試圖層的程式碼變更,而不需要建置整個應用程式時。若要獨立建置圖層,請使用指sam build layer-logical-id令指定圖層資源。

  • 作為 Lambda 函數的依賴關係。當您在相同 AWS SAM 範本檔案的 Lambda 函數Layers屬性中包含層的邏輯 ID 時,該層就是該 Lambda 函數的相依性。當該圖層還包含含有BuildMethod項目的Metadata資源屬性區段時,您可以透過使用指令建置整個應用程式,或透過使用指sam build令指定函數資源來建立圖層。sam build function-logical-id

範例

範本範例 1:針對 Python 3.9 執行階段環境建置圖層

下列範例 AWS SAM 範本會針對 Python 3.9 執行階段環境建置圖層。

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

模板示例 2:使用自定義生成文件構建圖層

下列範例 AWS SAM 範本使用自訂makefile來建立圖層。

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

下面makefile包含構建目標和將要執行的命令。請注意,ContentUri屬性設定為my_layer,因此 makefile 必須位於my_layer子目錄的根目錄中,且檔案名稱必須是。Makefile另請注意,構建加工品被複製到python/子目錄中 AWS Lambda ,以便能夠找到層代碼。

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

示例 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