使用带有 Lambda 层的 Lambda 层来提高效率 AWS SAM - AWS Serverless Application Model

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

使用带有 Lambda 层的 Lambda 层来提高效率 AWS SAM

使用 AWS SAM,您可以在无服务器应用程序中包含图层。 AWS Lambda 层允许您将代码从 Lambda 函数提取到 Lambda 层中,然后可以在多个 Lambda 函数中使用该层。这样做可以缩小部署包的大小,将核心功能逻辑与依赖项分开,并在多个函数之间共享依赖关系。有关层的更多信息,请参阅AWS Lambda 开发人员指南中的 Lambda 层

本主题提供有关以下内容的信息:

  • 在应用程序中包含层

  • 如何在本地缓存层

有关构建自定义层的更多信息,请参阅 在中构建 Lambda 图层 AWS SAM

在应用程序中包含层

要在应用程序中包含层,请使用 AWS::Serverless::Function 资源类型的 Layers 属性。

以下是带有包含层的 Lambda 函数的示例 AWS SAM 模板:

ServerlessFunction: Type: AWS::Serverless::Function Properties: CodeUri: . Handler: my_handler Runtime: Python3.7 Layers: - <LayerVersion ARN>

如何在本地缓存层

当您使用其中一个 sam local 命令调用函数时,函数的层包会被下载并缓存在本地主机上。

下表显示不同操作系统的默认缓存目录位置。

OS 位置
Windows 7 C:\Users\<user>\AppData\Roaming\AWS SAM
Windows 8 C:\Users\<user>\AppData\Roaming\AWS SAM
Windows 10 C:\Users\<user>\AppData\Roaming\AWS SAM
macOS ~/.aws-sam/layers-pkg
Unix ~/.aws-sam/layers-pkg

缓存软件包后, AWS SAM CLI 会将层叠加到用于调用函数的 Docker 映像上。 AWS SAMCLI生成其构建的图像以及缓存中保存 LayerVersions 的图像的名称。您可以在以下部分找到有关架构的更多详细信息。

要检查叠加层,请执行以下命令在要检查的映像中启动 bash 会话:

docker run -it --entrypoint=/bin/bash samcli/lambda:<Tag following the schema outlined in Docker Image Tag Schema> -i

层缓存目录名称架构

给 LayerVersionArn 定模板中定义的,会从 ARN 中 AWS SAMCLI提取 LayerName 和版本。它会创建一个目录,用于存放名为 LayerName-Version-<first 10 characters of sha256 of ARN> 的层内容。

例如:

ARN = arn:aws:lambda:us-west-2:111111111111:layer:myLayer:1 Directory name = myLayer-1-926eeb5ff1

Docker 映像标签架构

要计算唯一层哈希,请将所有唯一的层名称合并,分隔符为 '-',取 SHA256 哈希,然后取前 10 个字符。

例如:

ServerlessFunction: Type: AWS::Serverless::Function Properties: CodeUri: . Handler: my_handler Runtime: Python3.7 Layers: - arn:aws:lambda:us-west-2:111111111111:layer:myLayer:1 - arn:aws:lambda:us-west-2:111111111111:layer:mySecondLayer:1

唯一名称的计算方法与层缓存目录名称架构相同:

arn:aws:lambda:us-west-2:111111111111:layer:myLayer:1 = myLayer-1-926eeb5ff1 arn:aws:lambda:us-west-2:111111111111:layer:mySecondLayer:1 = mySecondLayer-1-6bc1022bdf

要计算唯一层哈希,请将所有唯一的层名称合并,分隔符为 '-',取 sha256 哈希,然后取前 25 个字符:

myLayer-1-926eeb5ff1-mySecondLayer-1-6bc1022bdf = 2dd7ac5ffb30d515926aef

然后将此值与函数的运行时和架构合并,分隔符为 '-':

python3.7-x86_64-2dd7ac5ffb30d515926aefffd