Lambda 层 - AWS Lambda
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Lambda 层

您可以将 Lambda 函数配置为以层的形式拉入其他代码和内容。是包含库、自定义运行时或其他依赖项的 .zip 文件存档。利用层,您可以在函数中使用库,而不必将库包含在部署程序包中。

注意

定义为容器映像的函数不支持层。在构建容器映像时,您可以将首选运行时和依赖项打包为映像的一部分。

使用层可以使您的部署包保持较小,从而使开发变得更轻松。您可以避免在使用函数代码安装和打包依赖项时可能出现的错误。对于 Node.js、Python 和 Ruby 函数,只要将部署程序包保持在 3 MB 下(且每个代码文件都小于 512 KB),就可以在 Lambda 控制台中开发函数代码

注意

一个函数一次可使用最多 五层。函数和所有层的总解压缩大小不能超出 250 MB 的解压缩部署程序包大小限制。有关更多信息,请参阅Lambda 配额

您可以创建层,也可以使用由 AWS 或者 AWS 客户发布的层。层支持基于资源的策略,这些策略用于向特定 AWS 账户、AWS Organizations 或所有账户授予层使用权限。

在函数执行环境中,层将提取到 /opt 目录。每个运行时将查找位于 /opt 下的不同位置的库(具体取决于语言)。构建层,以便函数代码无需额外配置即可访问库。

您还可以使用 AWS 无服务器应用程序模型 (AWS SAM) 来管理层和函数的层配置。有关说明,请参阅 AWS 无服务器应用程序模型 开发人员指南 中的使用层

将函数配置为使用层

在函数创建期间或之后,您可以在 Lambda 函数配置中指定最多 五层。选择要使用的层的特定版本。如果您稍后要使用其他版本,请更新函数的配置。

要将层添加到函数,请使用 update-function-configuration 命令。以下示例将添加两个层:一个来自与函数相同的账户的层,一个来自其他账户的层。

aws lambda update-function-configuration --function-name my-function \ --layers arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3 \ arn:aws:lambda:us-east-2:210987654321:layer:their-layer:2

您应看到以下输出:

{ "FunctionName": "test-layers", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs12.x", "Role": "arn:aws:iam::123456789012:role/service-role/lambda-role", "Layers": [ { "Arn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:3", "CodeSize": 169 }, { "Arn": "arn:aws:lambda:us-east-2:210987654321:layer:their-layer:2", "CodeSize": 169 } ], "RevisionId": "81cc64f5-5772-449a-b63e-12330476bcc4", ... }

您必须通过提供层版本的完整 Amazon 资源名称 (ARN) 来指定要使用的每个层的版本。在将层添加到已具有层的函数时,新列表会覆盖上一列表。每次更新层配置时都包括所有层。要删除所有层,请指定空列表。

aws lambda update-function-configuration --function-name my-function --layers []

您的函数在运行期间可以访问 /opt 目录中的层内容。层按指定的顺序应用,这将合并任何具有相同名称的文件夹。如果同一文件出现在多个层中,则使用最后应用的层中的版本。

层的创建者可删除您使用的层的版本。在发生此情况时,您的函数将继续运行,就好像层版本仍然存在一样。但在更新层配置时,必须先删除对已删除版本的引用。

创建层

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

在控制台中创建层

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

  2. 选择 Create layer (创建层)

  3. 对于 Name (名称),输入层名称。

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

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

    • 要从计算机上传 .zip 文件,请选择 Upload a .zip file (上传 .zip 文件),选择您的 .zip 文件,然后选择 Open (打开)

    • 要从 Amazon Simple Storage Service(Amazon S3) 中上传文件,请选择 Upload a file from Amazon S3 (从 中上传文件)。然后,对于 Amazon S3 link URL (链接 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

您应看到以下输出:

{ "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, "LicenseInfo": "MIT", "CompatibleRuntimes": [ "python3.6", "python3.7", "python3.8" ] }

每次调用 publish-layer-version 时,都将创建一个新版本。使用层的函数将直接引用层版本。您可以在现有层版本上配置权限,但要进行任何其他更改,则必须创建新版本。

管理层

要查找与 Lambda 函数的运行时兼容的层,请使用 list-layers 命令。

aws lambda list-layers --compatible-runtime python3.8

您应看到以下输出:

{ "Layers": [ { "LayerName": "my-layer", "LayerArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer", "LatestMatchingVersion": { "LayerVersionArn": "arn:aws:lambda:us-east-2:123456789012:layer:my-layer:2", "Version": 2, "Description": "My layer", "CreatedDate": "2018-11-15T00:37:46.592+0000", "CompatibleRuntimes": [ "python3.6", "python3.7", "python3.8", ] } } ] }

要列出所有层,您可以忽略运行时选项。响应中的详细信息反映层的最新版本。使用 list-layer-versions 查看层的所有版本。要查看有关版本的更多信息,请使用 get-layer-version

aws lambda get-layer-version --layer-name my-layer --version-number 2

您应看到以下输出:

{ "Content": { "Location": "https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-layer-91e9ea6e-492d-4100-97d5-a4388d442f3f?versionId=GmvPV.309OEpkfN...", "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:2", "Description": "My layer", "CreatedDate": "2018-11-15T00:37:46.592+0000", "Version": 2, "CompatibleRuntimes": [ "python3.6", "python3.7", "python3.8" ] }

响应中的链接可用于下载层存档。该链接的有效时间为 10 分钟。

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

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

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

层中包括库依赖项

您可以将运行时依赖项放入层中,从而将它们移出 Lambda 函数。每个 Lambda 运行时都包含指向 /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)

以下示例显示了如何构建层的文件夹架构。

Node.js

例 AWS X-Ray SDK 的文件结构

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 函数,您需要权限才能对层版本调用 GetLayerVersion。对于您账户中的函数,可通过您的用户策略或函数的基于资源的策略获取此权限。要使用另一个账户中的层,您需要用户策略的权限,并且另一个账户的拥有者必须使用基于资源的策略向您的账户授予权限。

要向另一个账户授予层使用权限,请使用 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"}

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

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

AWS CloudFormation 和 AWS SAM

要自动在您的应用程序中创建和映射层,请使用 AWS CloudFormation 模板中的 AWS SAM。AWS::Serverless::LayerVersion 资源类型创建一个层版本,您可以从 Lambda 函数配置中引用该版本。

blank-nodejs/template.yml – 无服务器资源

AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: An AWS 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 AWS Lambda API Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambdaReadOnlyAccess - 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

当您更新依赖关系和部署时,AWS SAM 会创建层的新版本并更新映射。如果您部署对代码的更改而不修改依赖关系,则 AWS SAM 会跳过层更新,从而节省上传时间。

示例应用程序

本指南的 GitHub 存储库提供了示例应用程序,演示了如何使用层来管理依赖关系。

有关空白示例应用程序的更多信息,请参阅 AWS Lambda 的 Blank 函数示例应用程序