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

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

构建应用程序

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

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

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

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

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

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

创建 .zip 文件存档

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

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

如果 Lambda 函数依赖于具有本地编译程序的包,请使用 --use-container 标志。此标志在行为类似于 Lambda 环境的 Docker 容器中本地编译您的函数,因此在您将它们部署到 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 软件包类型的示例应用程序,请参阅教程:部署 Hello World 应用程序中的 教程:部署 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

优先级

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

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

通过在源文件夹中构建项目来加快构建时间

对于受支持的运行时和构建方法,您可以使用 --build-in-source 选项直接在源文件夹中生成项目。默认情况下,Amazon SAM CLI 在临时目录中构建,其中包括复制源代码和项目文件。使用 --build-in-source,Amazon 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 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 资源属性中的 BuildProperties 下指定 UseNpmCi: True。要使用 npm ci,您的应用程序必须在 Lambda 函数的 CodeUri 中存在 package-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 外部构建一些函数资源

要在使用时 sam build 让 Amazon SAM 跳过某个函数,请在 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