创建和共享 Lambda 层 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

创建和共享 Lambda 层

Lambda 提供了一种方便的方法来打包库和其他可与 Lambda 函数搭配使用的依赖项。使用层可以缩小上传的部署存档的大小,并加快代码的部署速度。

层是可以包含其他代码或数据的 .zip 文件存档。层可以包含库、自定义运行时、数据或配置文件。层可促进代码共享和责任分离,以便您可以更快地迭代编写业务逻辑。

只能在将 Lambda 函数部署为 .zip 文件归档的情况下使用层。对于定义为容器映像的函数,您可以在创建容器映像时打包首选运行时和所有代码依赖项。有关更多信息,请参阅Amazon计算博客上的在容器镜像中使用 Lambda 层和扩展

您可以使用 Lambda 控制台、Lambda API、Amazon CloudFormation、或 Amazon Serverless Application Model (Amazon SAM)。有关使用 Amazon SAM 创建层的更多信息,请参阅 Amazon Serverless Application Model 开发人员指南中的使用图层

创建层内容

创建层时,必须将其所有内容捆绑到 .zip 文件存档中。您可以从 Amazon Simple Storage Service (Amazon S3) 或本地计算机将 .zip 文件归档上载到层。设置函数的执行环境时,Lambda 将图层内容提取到 /opt 目录。

为层编译 .zip 文件存档

您可以使用与函数部署程序包相同的程序将层代码构建到 .zip 文件归档中。如果您的层包含任何原生代码库,则必须使用 Linux 开发计算机编译和构建这些库,以便二进制文件与 Amazon Linux 兼容。

创建层时,可以指定该层与一个或两个指令集架构兼容。您可能需要设置特定的编译标志才能构建与 arm64 架构兼容的层。

确保为 Lambda 正确打包库的一种方法是使用 Amazon Cloud9。有关更多信息,请参阅Amazon计算博客上的使用 Lambda 层简化开发过程

在层中包括库依赖项

对于每个 Lambda 运行时,PATH 变量都包括 /opt 目录中的特定文件夹。如果在层 .zip 文件存档中定义了相同的文件夹结构,则函数代码无需指定路径即可访问层内容。

下表列出了每个运行时支持的文件夹路径。

每个 Lambda 运行时的层路径
运行时 路径

Node.js

nodejs/node_modules

nodejs/node14/node_modules (NODE_PATH)

Python

python

python/lib/python3.9/site-packages(站点目录)

Java

java/lib (CLASSPATH)

Ruby

ruby/gems/2.7.0 (GEM_PATH)

ruby/lib (RUBYLIB)

所有运行时

bin (PATH)

lib (LD_LIBRARY_PATH)

以下示例显示了如何构建层 .zip 存档中的文件夹架构。

Node.js

例 适用于 Node.js 的 Amazon X-Ray 开发工具包的文件结构

xray-sdk.zip └ nodejs/node_modules/aws-xray-sdk
Python

例 Pillow 库的文件结构

pillow.zip │ python/PIL └ python/Pillow-5.3.0.dist-info
Ruby

例 JSON gem 的文件结构

json.zip └ ruby/gems/2.5.0/ | build_info | cache | doc | extensions | gems | └ json-2.1.0 └ specifications └ json-2.1.0.gemspec
Java

例 Jackson JAR 文件的文件结构

jackson.zip └ java/lib/jackson-core-2.2.3.jar
All

例 JQ 库的文件结构

jq.zip └ bin/jq

有关 Lambda 执行环境中路径设置的更多信息,请参阅 定义运行时环境变量

特定语言的说明

有关如何创建 .zip 文件归档的特定语言的说明,请参阅以下主题。

Node.js

使用 .zip 文件归档部署 Node.js Lambda 函数

Python

使用 .zip 文件归档部署 Python Lambda 函数

Ruby

使用 .zip 文件归档部署 Ruby Lambda 函数

Java

使用 .zip 或 JAR 文件归档部署 Java Lambda 函数

Go

使用 .zip 文件归档部署 Go Lambda 函数

C#

使用 .zip 文件归档部署 C# Lambda 函数

PowerShell

使用 .zip 文件归档部署 PowerShell Lambda 函数

创建层

您可以使用 Lambda 控制台或 Lambda API 创建新层。

层可以有一个或多个版本。创建层时,Lambda 将层版本设置为版本 1。您可以配置现有层版本的权限,但要更新代码或进行其他配置更改,则必须创建层的新版本。

创建层(控制台)

  1. 打开 Lambda 控制台的 Layers(层)页面

  2. 选择 Create layer (创建层)

  3. Layer configuration(层配置)下,在 Name(名称)中,输入层的名称。

  4. (可选)对于 Description (描述),输入对层的描述。

  5. 要上载层代码,请执行以下操作之一:

    • 要从计算机上载 .zip 文件,请选择 Upload a .zip file(上载 .zip 文件)。然后,选择 Upload(上载)以选择本地 .zip 文件。

    • 要从 Amazon S3 上传文件,请选择 Upload a file from Amazon S3(从 Amazon S3 上载文件)。然后,对于 Amazon S3 link URL(Amazon S3 链接 URL),输入文件的链接。

  6. (可选)对于兼容的指令集架构,选择一个值或两个值。

  7. (可选)对于 Compatible runtimes (兼容的运行时),最多选择 15 个运行时。

  8. (可选)对于 License (许可证),输入任何必要的许可证信息。

  9. 选择创建

创建层 (API)

要创建层,请将 publish-layer-version 命令与名称、描述、.zip 文件归档、运行时列表和与层兼容的架构列表结合使用。运行时和架构参数可选。

aws lambda publish-layer-version --layer-name my-layer --description "My layer" \ --license-info "MIT" --content S3Bucket=lambda-layers-us-east-2-123456789012,S3Key=layer.zip \ --compatible-runtimes python3.6 python3.7 python3.8 --compatible-architectures "arm64" "x86_64"

您应该可以看到类似于如下所示的输出内容:

{ "Content": { "Location": "https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-layer-4aaa2fbb-ff77-4b0a-ad92-5b78a716a96a?versionId=27iWyA73cCAYqyH...", "CodeSha256": "tv9jJO+rPbXUUXuRKi7CwHzKtLDkDRJLB3cC3Z/ouXo=", "CodeSize": 169 }, "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer", "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:1", "Description": "My layer", "CreatedDate": "2018-11-14T23:03:52.894+0000", "Version": 1, "CompatibleArchitectures": [ "arm64", "x86_64" ], "LicenseInfo": "MIT", "CompatibleRuntimes": [ "python3.6", "python3.7", "python3.8" ] }
注意

每次调用 publish-layer-version 时,都将创建一个新版本的层。

删除层版本

要删除层版本,请使用 delete-layer-version 命令。

aws lambda delete-layer-version --layer-name my-layer --version-number 1

删除一个层版本后,您无法再将 Lambda 函数配置为使用该层版本。但是,已使用此版本的任何函数仍能访问它。层名称绝不会重复使用版本号。

配置层权限

默认情况下,您创建的层是 Amazon 账户私有的。但是,您可以选择与其他账户共享层或将其公开。

要向另一个账户授予层使用权限,请使用 add-layer-version-permission 命令向层版本的权限策略添加语句。在每个语句中,您可以向单个账户、所有账户或组织授予权限。

aws lambda add-layer-version-permission --layer-name xray-sdk-nodejs --statement-id xaccount \ --action lambda:GetLayerVersion --principal 210987654321 --version-number 1 --output text

您应该可以看到类似于如下所示的输出内容:

e210ffdc-e901-43b0-824b-5fcd0dd26d16 {"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::210987654321:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-2:123456789012:layer:xray-sdk-nodejs:1"}

权限仅适用于单个层版本。每次创建新的层版本时都需重复此过程。

有关更多示例,请参阅 向其他账户授予层访问权

与层结合使用 Amazon CloudFormation

您可以使用 Amazon CloudFormation 创建层并将层与 Lambda 函数关联起来。以下示例模板会创建一个名为 blank-nodejs-lib 的层,并使用 Layers(层)属性将该层附加到 Lambda 函数。

AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: A Lambda application that calls the Lambda API. Resources: function: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs12.x CodeUri: function/. Description: Call the Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambda_ReadOnlyAccess - AWSXrayWriteOnlyAccess Tracing: Active Layers: - !Ref libs libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-nodejs-lib Description: Dependencies for the blank sample app. Content: S3Bucket: my-bucket-region-123456789012 S3Key: layer.zip CompatibleRuntimes: - nodejs12.x