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

创建和共享 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 目录中。

使用 Amazon CLI

您可以使用 Lambda 控制台或 Amazon Command Line Interface (Amazon CLI) 为层创建和上传 .zip 文件。有关特定于语言的说明,请参阅以下主题。

为层编译 .zip 文件存档

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

确保 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.8/site-packages(站点目录)

Java

java/lib (CLASSPATH)

Ruby

ruby/gems/2.5.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 执行环境中路径设置的更多信息,请参阅 定义运行时环境变量

创建层

您可以使用 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 链接 URL,输入文件的链接。

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

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

  8. 选择创建

创建层 (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

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

{ "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-cn:lambda:us-east-2:123456789012:layer:my-layer", "LayerVersionArn": "arn:aws-cn:lambda:us-east-2:123456789012:layer:my-layer:1", "Description": "My layer", "CreatedDate": "2018-11-14T23:03:52.894+0000", "Version": 1, "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-cn:iam::210987654321:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws-cn:lambda:us-east-2:123456789012:layer:xray-sdk-nodejs:1"}

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

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

与层结合使用 Amazon CloudFormation

您可以使用 Amazon CloudFormation 创建层并将层与 Lambda 函数关联起来。以下示例模板创建一个名为 blank-nodejs-lib 的层,并使用属性将该层附加到 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. ContentUri: lib/. CompatibleRuntimes: - nodejs12.x