本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
构建层
您可以使用 Amazon SAM 构建自定义层。有关层的信息,请参阅《Amazon Lambda 开发人员指南》中的 Amazon Lambda 层。
要构建自定义层,请在您的 Amazon Serverless Application Model (Amazon SAM) 模板文件中对其进行声明,并在 Metadata
资源属性部分加入一个 BuildMethod
条目。BuildMethod
的有效值是 Amazon Lambda 运行时系统或 makefile
的标识符。纳入一个 BuildArchitecture
条目以指定您的层支持的指令集架构。BuildArchitecture
的有效值是 Lambda 指令集架构。
如果指定 makefile
,请提供自定义 makefile,在其中声明包含层构建命令的表单 build-
的构建目标。如有必要,您的 makefile 负责编译层,并将构建构件复制到工作流程中后续步骤所需的适当位置。Makefile 的位置由层资源的 layer-logical-id
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
# Build the 'function-logical-id' resource and layers that this function depends onlayer-logical-id
$
sam build
# Build the entire application, including the layers that any function depends onfunction-logical-id
$
sam build