构建应用程序 - Amazon Serverless Application Model
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

构建应用程序

要构建您的无服务器应用程序,请使用sam bu命令。此命令还会收集应用程序依赖项的构建工件,并将它们放在正确的格式和位置以供后续步骤(例如本地测试、打包和部署)使用。

您可以在requirements.txt (Python) 或package.json (Node.js) 等清单文件中指定应用程序的依赖关系,也可以使用函数资源的Layers属性来指定应用程序的依赖关系。该Layers属性包含 Lambda 函数所依赖的Amazon Lambda图层资源列表。

应用程序构建工件的格式取决于每个函数的PackageType属性。此属性的选项是:

  • Zip— 包含应用程序代码及其依赖项的。如果要将代码打包为 .zip 文件存档,则必须为函数指定 Lambda 运行时。

  • Image— 容器映像,包括基本操作系统、运行时、扩展,以及应用程序代码及其依赖项。

有关 Lambda 包类型的更多信息,请参阅Amazon Lambda开发人员指南中的 Lambda 部署包

编译 .zip 文件存档

要将无服务器应用程序编译为 .zip 文件存档,请PackageType: Zip为无服务器函数申报。

Amazon SAM根据您指定的架构建应用程序。如果您未指定架构,则x86_64默认Amazon SAM使用。

如果您的 Lambda 函数依赖于具有原生编译程序的软件包,请使用标--use-container志。此标志在行为类似于 Lambda 环境的 Docker 容器中本地编译您的函数,因此在您部署它们到Amazon云时,它们的格式正确。

当您使用该--use-container选项时,默认情况下会从 Amazon ECR Pub licAmazon SAM 提取容器镜像。例如,如果您想从另一个存储库提取容器映像 DockerHub,则可以使用--build-image选项并提供备用容器映像的 URI。以下是使用 DockerHub 存储库中的容器镜像构建应用程序的两个示例命令:

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

有关您可以使用的 URI 列表--build-image,请参阅镜像存储库其中包含多个支持的运行时的 DockerHub URI。

有关构建.zip 文件存档应用程序的其他示例,请参阅本主题后面的 “示例” 部分。

构建容器镜像

要将您的无服务器应用程序构建为容器镜像,请声明PackageType: Image您的无服务器函数。您还必须使用以下条目声明Metadata资源属性:

Dockerfile

与 Lambda 函数关联的 Dockerfile 的名称。

DockerContext

Dockerfile 的位置。

DockerTag

(可选)应用于构建映像的标签。

DockerBuildArgs

为编译生成参数。

以下是Metadata资源属性部分的示例:

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

要下载使用Image包类型配置的示例应用程序,请参阅步骤 1:下载示例Amazon SAM应用程序教程:部署 Hello World 应用程序。在询问您要安装哪种软件包类型的提示时,选择Image

注意

如果您在 Dockerfile 中指定了多架构基础映像,则会为主机的架构Amazon 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

优先顺序

  • 您为特定资源提供的环境变量优先于所有资源的单一环境变量。

  • 您在命令行上提供的环境变量优先于文件中的环境变量。

示例

示例 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 12 application using a container image pulled from DockerHub sam build --use-container --build-image amazon/aws-sam-cli-build-image-nodejs12.x # Build a function resource using the Python 3.8 container image pulled from DockerHub sam build --use-container --build-image Function1=amazon/aws-sam-cli-build-image-python3.8 # Build and run your functions locally sam build && sam local invoke # For more options sam build --help

示例 2:容器镜像

以下Amazon SAM模板作为容器镜像构建:

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

以下是 Dockerfile 的示例:

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

示例 3:npm ci

对于 Node.js 应用程序,您可以使用npm ci代替npm install来安装依赖项。要使用npm ci,请在您的 Lambda 函数的Metadata资源属性UseNpmCi: TrueBuildProperties指定。要使用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: nodejs14.x Architectures: - x86_64 Events: HelloWorld: Type: Api Properties: Path: /hello Method: get Metadata: BuildProperties: UseNpmCi: True

在外部构建功能Amazon SAM

默认情况下,当您运行时sam build,Amazon SAM会生成所有函数资源。其他选项包括:

  • 在之外构建所有函数资源Amazon SAM-如果您手动或通过其他工具构建所有函数资源,则sam build不是必需的。您可以跳过sam build并转到流程中的下一步,例如执行本地测试或部署应用程序。

  • 在外部构建一些函数资源Amazon SAM-如果您Amazon SAM想在构建某些函数资源的同时在外部构建其他函数资源Amazon SAM,可以在Amazon SAM模板中指定。

在之外构建一些函数资源Amazon SAM

要在使用时Amazon SAM跳过某个函数sam build,请在Amazon 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,Amazon SAM将执行以下操作:

  1. Amazon SAM将跳过配置为的函数SkipBuild: True

  2. Amazon SAM将构建所有其他函数资源并将它们缓存在.aws-sam构建目录中。

  3. 对于跳过的函数,它们在.aws-sam构建目录中的模板将自动更新,以引用您的构建函数资源的指定路径。

    以下是.aws-sam构建目录TestFunction中缓存的模板的示例:

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