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

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

构建应用程序

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

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

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

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

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

有关 Lambda 程序包类型的更多信息,请参阅 中的 Lambda 部署程序包AWS Lambda Developer Guide

生成 .zip 文件存档

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

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

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

构建容器映像

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

  • Dockerfile:与 Lambda 函数关联的 Dockerfile 的名称

  • DockerContext:Dockerfile 的位置

  • DockerTag:要应用于构建的映像的可选标签

  • DockerBuildArgs:为构建构建构建参数

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

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

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

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 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

以下是一个示例 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"]