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

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

构建层

您可以使用 Amazon SAM 构建自定义层。有关层的信息,请参阅《Amazon Lambda 开发人员指南》中的 Amazon Lambda 层

要构建自定义层,请在您的 Amazon Serverless Application Model (Amazon SAM) 模板文件中对其进行声明,并在 Metadata 资源属性部分加入一个 BuildMethod 条目。BuildMethod 的有效值是 Amazon Lambda 运行时系统makefile 的标识符。纳入一个 BuildArchitecture 条目以指定您的层支持的指令集架构。BuildArchitecture 的有效值是 Lambda 指令集架构

如果指定 makefile,请提供自定义 makefile,在其中声明包含层构建命令的表单 build-layer-logical-id 的构建目标。如有必要,您的 makefile 负责编译层,并将构建构件复制到工作流程中后续步骤所需的适当位置。Makefile 的位置由层资源的 ContentUri 属性指定,并且必须命名为 Makefile

注意

创建自定义层时,Amazon Lambda 依靠环境变量来查找层代码。Lambda 运行时系统包含将您的层代码复制到的 /opt 目录中的路径。项目的构建构件文件夹结构必须与运行时系统的预期文件夹结构相匹配,这样才能找到自定义层代码。

例如,对于 Python,您可以将代码放在 python/ 子目录中。对于 NodeJS,您可以将代码放在 nodejs/node_modules/ 子目录中。

有关更多信息,请参阅《Amazon Lambda 开发人员指南》中的在层中包括库依赖项

以下是 Metadata 资源属性部分的示例。

Metadata: BuildMethod: python3.8 BuildArchitecture: arm64
注意

如果您不包括 Metadata 资源属性部分,则 Amazon SAM 不构建层。相反,它会从层资源 CodeUri 属性中指定的位置复制构建构件。有关更多信息,请参阅 AWS::Serverless::LayerVersion 资源类型中 ContentUri 属性。

当包含 Metadata 资源属性部分时,您可以使用 sam build 命令来构建层,既可以作为独立对象,也可以作为 Amazon Lambda 函数的依赖项。

  • 作为独立对象。您可能只想构建层对象,例如,当您在本地测试层的代码更改并且不需要构建整个应用程序时。要独立构建层,请使用 sam build layer-logical-id 命令指定层资源。

  • 作为 Lambda 函数的依赖项。当您在同一 Amazon SAM 模板文件的 Lambda 函数的 Layers 属性中包含层的逻辑 ID 时,该层就是该 Lambda 函数的依赖项。当该层还包括带有 BuildMethod 条目的 Metadata 资源属性部分时,您可以通过使用 sam build 命令构建整个应用程序或使用 sam build function-logical-id 命令指定函数资源来构建该层。

示例

模板示例 1:基于 Python 3.9 运行时系统环境构建层

以下示例 Amazon SAM 模板基于 Python 3.9 运行时系统环境构建层。

Resources: MyLayer: Type: AWS::Serverless::LayerVersion Properties: ContentUri: my_layer CompatibleRuntimes: - python3.9 Metadata: BuildMethod: python3.9 # Required to have Amazon SAM build this layer

模板示例 2:使用自定义 makefile 构建层

以下示例 Amazon SAM 模板使用自定义模板 makefile 构建层。

Resources: MyLayer: Type: AWS::Serverless::LayerVersion Properties: ContentUri: my_layer CompatibleRuntimes: - python3.8 Metadata: BuildMethod: makefile

以下 makefile 包含构建目标和将要执行的命令。请注意,ContentUri 属性设置为 my_layer,因此 makefile 必须位于 my_layer 子目录的根目录中,并且文件名必须为 Makefile。另请注意,将构建构件复制到 python/ 子目录中,以便 Amazon Lambda 能够找到层代码。

build-MyLayer: mkdir -p "$(ARTIFACTS_DIR)/python" cp *.py "$(ARTIFACTS_DIR)/python" python -m pip install -r requirements.txt -t "$(ARTIFACTS_DIR)/python"

sam 构建命令示例

以下 sam build 命令构建包含 Metadata 资源属性部分的层。

# Build the 'layer-logical-id' resource independently $ sam build layer-logical-id # Build the 'function-logical-id' resource and layers that this function depends on $ sam build function-logical-id # Build the entire application, including the layers that any function depends on $ sam build