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

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

生成应用

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

您可以在清单文件中指定应用程序的依赖关系,例如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为了你的无服务器功能。

Amazon SAM构建你的应用程序建筑你指定的。如果不指定架构,Amazon SAM使用x86_64默认情况下。

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

当您使用--use-container选项,默认情况下Amazon SAM从拉取容器映像Amazon ECR Public. 例如,如果你想从另一个存储库中提取容器镜像,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 文件,请使用--container-env-var-file使用参数sam build命令。您可以提供适用于所有无服务器资源的单个环境变量,也可以为每个资源提供不同的环境变量。

格式

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

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