本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
构建应用程序
要构建您的无服务器应用程序,请使用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用于您的无服务器功能。
Amazon SAM为... 构建应用程序建筑您指定的值。如果不指定架构,Amazon SAM使用x86_64默认情况下。
如果您的 Lambda 函数依赖于具有本机编译程序的软件包,请使用--use-containerFlags。此标志在行为类似于 Lambda 环境的 Docker 容器中本地编译您的函数,因此当您将它们部署到AmazonCloud。
当您使用以下应用程序时:--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 函数关联的 Docker File 的名称。
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与之argumentsam 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"]
示例 3:npm ci
对于 Node.js 应用程序,你可以使用npm ci而不是npm
install安装依赖项。要使用npm ci,请指定UseNpmCi: True下BuildProperties在您的 Lambda 函数中Metadata资源属性。要使用npm ci,则应用程序必须具有package-lock.json要么npm-shrinkwrap.json文件存在于CodeUri用于您的 Lambda 函数。
以下示例使用了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