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

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

生成应用程序

要构建无服务器应用程序,请使用sam build命令。此命令还收集应用程序依赖关系的构建工件,并将它们置于适当的格式和位置,以供后续步骤(例如本地测试、打包和部署)使用。

您可以在清单文件中指定应用程序的依赖关系,例如requirements.txt(Python)或package.json(Node.js),或者通过使用Layers属性的函数资源。这些区域有:Layers属性包含Amazon Lambda层Lambda 函数所依赖的资源。

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

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

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

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

生成 .zip 文件存档

要将无服务器应用程序构建为 .zip 文件存档,请声明PackageType: Zip用于您的无服务器函数。

如果 Lambda 函数依赖于具有本地编译的程序的程序包,请使用--use-container标志。此标志会在 Docker 容器中本地编译函数,该容器的行为类似于 Lambda 环境,因此当您将它们部署到Amazon云。

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

# 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 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,请参阅映像存储库,其中包含多个受支持的运行时的 Docker Hub 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

容器环境变量文件

要提供包含构建容器环境变量的 JSON 文件,请使用--container-env-var-file参数与sam build命令。您可以提供适用于所有无服务器资源的单个环境变量,也可以为每个资源提供不同的环境变量。

Format

将环境变量传递到构建容器的格式取决于您为资源提供的环境变量的数量。

要为所有资源提供单个环境变量,请指定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

Precedence

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

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

Examples

示例 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 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:Container image

以下Amazon 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.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"]