默認構建 AWS SAM - AWS Serverless Application Model

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

默認構建 AWS SAM

若要建置無伺服器應用程式,請使用指sam build令。此命令也會收集應用程式相依性的建置成品,並將它們置於適當的格式和位置,以便進行後續步驟,例如本機測試、封裝和部署。

您可以在資訊清單檔案中指定應用程式的相依性,例如 requirements.txt package.json (Python) 或 (Node.js),或使用函數資源的Layers屬性。此Layers屬性包含 Lambda 函數所依賴的AWS Lambda 圖層資源清單。

應用程序的構建成品的格式取決於每個函數的PackageType屬性。此屬性的選項包括:

  • Zip— .zip 檔案封存,其中包含您的應用程式程式碼及其相依性。如果您將程式碼封裝為 .zip 檔案封存,則必須為函數指定 Lambda 執行階段。

  • Image— 容器映像檔,其中包括基本作業系統、執行階段和擴充功能,以及您的應用程式程式碼及其相依性。

如需 Lambda 套件類型的詳細資訊,請參閱AWS Lambda 開發人員指南中的 Lambda 部署套件

建立 .zip 檔案封存

若要將無伺服器應用程式建置為 .zip 檔案封存,請PackageType: Zip針對無伺服器函數宣告。

AWS SAM 針對您指定的架構建置應用程式。如果您未指定架構,則x86_64依預設 AWS SAM 會使用。

如果您的 Lambda 函數依賴於具有原生編譯程式的套件,請使用--use-container旗標。此旗標會在本機編譯 Docker 容器中的函數,該容器的行為類似於 Lambda 環境,因此當您將函數部署到雲端時,它們會採用正確的格式。 AWS

當您使用--use-container此選項時,依預設會從 Amazon ECR 公開 AWS SAM提取容器映像檔。例如,如果您想要從另一個儲存庫提取容器映像檔 DockerHub,您可以使用此--build-image選項並提供替代容器映像檔的 URI。以下是使用 DockerHub 儲存庫中的容器映像建置應用程式的兩個範例命令:

# Build a Node.js 20 application using a container image pulled from DockerHub sam build --use-container --build-image amazon/aws-sam-cli-build-image-nodejs20.x # Build a function resource using the Python 3.12 container image pulled from DockerHub sam build --use-container --build-image Function1=amazon/aws-sam-cli-build-image-python3.12

如需可搭配使用的 URI 清單--build-image,請參閱映像儲存庫其中包含許多受支援執行階段的 DockerHub URI。

如需建立 .zip 檔案封存應用程式的其他範例,請參閱本主題稍後的 < 範例 > 一節。

建立容器映像檔

若要將無伺服器應用程式建置為容器映像檔,請PackageType: Image針對無伺服器函數宣告。您也必須使用下列項目宣告Metadata資源屬性:

Dockerfile

與 Lambda 函數相關聯的碼頭檔案的名稱。

DockerContext

碼頭文件的位置。

DockerTag

(選擇性) 要套用至建置影像的標記。

DockerBuildArgs

為構建構建構建立參數。

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

Metadata: Dockerfile: Dockerfile DockerContext: ./hello_world DockerTag: v1

若要下載使用Image套件類型設定的範例應用程式,請參閱教學課程:部署 Hello World 應用程式教學課程:部署 Hello World 應用程式中的。在詢問您要安裝哪種套件類型的提示下,選擇Image

注意

如果您在 Dockerfile 中指定了多架構基礎映像檔,請為主機的架構 AWS SAM 建立容器映像檔。若要針對不同的架構進行建置,請指定使用特定目標架構的基礎映像檔。

容器環境變量文件

若要提供包含組建容器環境變數的 JSON 檔案,請搭配sam build命令使用--container-env-var-file引數。您可以提供套用至所有無伺服器資源的單一環境變數,或為每個資源提供不同的環境變數。

格式

將環境變數傳遞至組建容器的格式取決於您為資源提供的環境變數數目。

若要為所有資源提供單一環境變數,請指定如下所示的Parameters物件:

{ "Parameters": { "GITHUB_TOKEN": "TOKEN_GLOBAL" } }

若要為每個資源提供不同的環境變數,請為每個資源指定物件,如下所示:

{ "MyFunction1": { "GITHUB_TOKEN": "TOKEN1" }, "MyFunction2": { "GITHUB_TOKEN": "TOKEN2" } }

將您的環境變數儲存為檔案,例如命名env.json。以下命令使用此文件將環境變量傳遞給構建容器:

sam build --use-container --container-env-var-file env.json

優先順序

  • 您為特定資源提供的環境變數優先於所有資源的單一環境變數。

  • 您在命令列上提供的環境變數優先於檔案中的環境變數。

通過在源文件夾中構建項目來加快構建時間

對於支持的運行時和構建方法,您可以使用該--build-in-source選項直接在源文件夾中構建項目。默認情況下, AWS SAM CLI構建在臨時目錄中,其中涉及複製源代碼和項目文件。使用--build-in-source,直接在源文件夾中 AWS SAM CLI構建,通過消除將文件複製到臨時目錄的需要來加快構建過程。

如需支援的執行階段和建置方法的清單,請參閱--build-in-source

範例

範例 1:.zip 檔案封存

下列sam build指令會建立 .zip 檔案封存:

# Build all functions and layers, and their dependencies sam build # Run the build process inside a Docker container that functions like a Lambda environment sam build --use-container # Build a Node.js 20 application using a container image pulled from DockerHub sam build --use-container --build-image amazon/aws-sam-cli-build-image-nodejs20.x # Build a function resource using the Python 3.12 container image pulled from DockerHub sam build --use-container --build-image Function1=amazon/aws-sam-cli-build-image-python3.12 # Build and run your functions locally sam build && sam local invoke # For more options sam build --help

範例 2:容器影像

下列 AWS SAM 範本會建置為容器映像檔:

Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: PackageType: Image ImageConfig: Command: ["app.lambda_handler"] Metadata: Dockerfile: Dockerfile DockerContext: ./hello_world DockerTag: v1

下面是一個例子碼頭文件:

FROM public.ecr.aws/lambda/python:3.12 COPY app.py requirements.txt ./ RUN python3.12 -m pip install -r requirements.txt # Overwrite the command by providing a different command directly in the template. CMD ["app.lambda_handler"]

範例 3:故宮 CI

對於 Node.js 應用程序,您可以使用npm ci而不是npm install安裝依賴項。若要使用npm ci,請UseNpmCi: TrueBuildProperties在 Lambda 函數的Metadata資源屬性中指定下方。若要使用npm ci,您的應用程式必須具有 Lambda 函數CodeUripackage-lock.jsonnpm-shrinkwrap.json檔案。

下列範例會npm ci在您執行時安裝相依性sam build

Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello-world/ Handler: app.handler Runtime: nodejs20.x Architectures: - x86_64 Events: HelloWorld: Type: Api Properties: Path: /hello Method: get Metadata: BuildProperties: UseNpmCi: True

建立以外的功能 AWS SAM

依預設,當您執行時sam build,會 AWS SAM 建置所有函式資源。其他選項包括:

  • 在以外構建所有函數資源 AWS SAM-如果您手動或通過其他工具構建所有函數資源,sam build則不需要。您可以跳過sam build並繼續進行程序中的下一個步驟,例如執行本機測試或部署應用程式。

  • 在以外建置一些函式資源 AWS SAM — 如果您想 AWS SAM 要建置一些函式資源,同時在其他函式資源之外建置 AWS SAM,您可以在 AWS SAM 範本中指定此資源。

在以外構建一些函數資源 AWS SAM

要在使用時 AWS SAM 跳過某個功能sam build,請在 AWS SAM 模板中配置以下內容:

  1. SkipBuild: True中繼資料屬性新增至您的函數。

  2. 指定建置函式資源的路徑。

這是一個示例,TestFunction配置為被跳過。它的內置資源位於built-resources/TestFunction.zip.

TestFunction: Type: AWS::Serverless::Function Properties: CodeUri: built-resources/TestFunction.zip Handler: TimeHandler::handleRequest Runtime: java11 Metadata: SkipBuild: True

現在,當您運行時sam build, AWS SAM 將執行以下操作:

  1. AWS SAM 將跳過配置的功能SkipBuild: True

  2. AWS SAM 將構建所有其他函數資源並將其緩存在.aws-sam構建目錄中。

  3. 對於跳過的函數,它們在 .aws-sam build 目錄中的模板將自動更新,以引用指定的路徑到您的構建函數資源。

    以下是.aws-sam構建目錄TestFunction中緩存模板的示例:

    TestFunction: Type: AWS::Serverless::Function Properties: CodeUri: ../../built-resources/TestFunction.zip Handler: TimeHandler::handleRequest Runtime: java11 Metadata: SkipBuild: True