将层与 Lambda 函数结合使用
Lambda 层是可以包含其他代码或其他内容的 .zip 文件归档。层可以包含库、自定义运行时、数据或配置文件。使用层可以缩小部署包大小,并促进代码共享和责任分离,以便您可以更快地迭代编写业务逻辑。
只能在将 Lambda 函数部署为 .zip 文件归档的情况下使用层。对于定义为容器映像的函数,您可以在创建容器映像时打包首选运行时和所有代码依赖项。有关更多信息,请参阅Amazon计算博客上的在容器镜像中使用 Lambda 层和扩展
将函数配置为使用层
您最多可以在 Lambda 函数中添加五个层。函数和所有层的总解压缩大小不能超出 250 MB 的解压缩部署程序包大小配额。有关更多信息,请参阅Lambda 配额。
如果您的函数使用了其他 Amazon 账户发布的层,则函数可以在删除层版本后或在撤消访问该层的权限后继续使用该层版本。但是,您无法创建使用已删除层版本的新函数。
确保添加到函数的层与函数的运行时和指令集架构兼容。
使用控制台配置层
向函数添加层
打开 Lamba 控制台的 Functions page
(函数页面)。 -
选择要配置的函数。
-
在层下,选择添加层。
-
在选择层下,选择一个层源。
-
对于 Amazon 层或自定义层层源:
-
从下拉菜单中选择层。
-
在版本下,从下拉菜单中选择层版本。每个层版本条目都列出了其兼容的运行时和架构。
选择 Add(添加)。
-
-
对于指定 ARN层源:
-
在文本框中输入 ARN,然后选择验证。
选择 Add(添加)。
-
添加层的顺序是 Lambda 稍后将层内容合并到执行环境中的顺序。您可以使用控制台更改层合并顺序。
更新函数的层顺序
打开 Lamba 控制台的 Functions page
(函数页面)。 -
选择要配置的函数。
-
在层下,选择编辑。
-
选择其中一个图层。
-
选择提前合并或者稍后合并以调整层的顺序。
-
选择保存。
已对层进行版本控制,每个层版本的内容是不可变的。层所有者可以发布新的层版本以提供更新的内容。您可以使用控制台更新函数的层版本。
为函数更新层版本
打开 Lamba 控制台的 Functions page
(函数页面)。 -
在 Additional resources(其他资源)下,选择 Layers(层)。
-
选择要修改的层。
-
在 Functions using this version(使用此版本的函数)下,选择要修改的函数,然后选择 Edit(编辑)。
-
从 Layer version(层版本)中,选择要更改的目标层版本。
-
选择 Update functions(更新函数)。
不能跨 Amazon 账户更新函数的层版本。
使用 API 配置层
要将层添加到函数,请使用 update-function-configuration 命令。以下示例将添加两个层:一个来自与函数相同的 Amazon 账户的层,一个来自其他账户的层。
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:111122223333:layer:their-layer:2
您应该可以看到类似于如下所示的输出内容:
{ "FunctionName": "test-layers", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs16.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:111122223333:layer:their-layer:2", "CodeSize": 169 } ], "RevisionId": "81cc64f5-5772-449a-b63e-12330476bcc4", ... }
要指定要使用的层版本,您必须提供每个层版本的完整 Amazon Resource Name (ARN)。在将层添加到已具有层的函数时,将覆盖之前的层列表。请务必在每次更新层配置时都包括所有层。添加层的顺序是 Lambda 稍后将层内容提取到执行环境的顺序。
要删除所有层,请指定空列表。
aws lambda update-function-configuration --function-name my-function --layers []
层的创建者可以删除层的某个版本。如果您正在函数中使用该层版本,则函数将继续运行,就像层版本仍然存在一样。但在更新层配置时,必须先删除对已删除版本的引用。
已对层进行版本控制,每个层版本的内容是不可变的。层所有者可以发布新的层版本以提供更新的内容。您可以使用 API 更新函数使用的层版本。
为函数更新层版本
要更新函数的一个或多个层版本,请使用 update-function-configuration 命令。结合使用 --layers
选项和此命令以包括函数的所有层版本,即使您要更新其中一个层版本也是如此。如果函数已有层,则新列表会覆盖之前的列表。
下面的程序步骤假定您已将更新的层代码打包到名为 layer.zip
的本地文件中。
-
(可选)如果尚未发布新的层版本,请发布新版本。
aws lambda publish-layer-version --layer-name
my-layer
--description"My layer"
--license-info"MIT"
\ --zip-file"fileb://layer.zip"
--compatible-runtimespython3.6 python3.7
-
(可选)如果函数有多个层,请获取与函数关联的当前层版本。
aws lambda get-function-configuration --function-name
my-function
--query 'Layers[*].Arn' --output yaml -
将新层版本添加到函数。在以下示例命令中,函数还具有名为
other-layer:5
的层版本:aws lambda update-function-configuration --function-name
my-function
\ --layersarn:aws:lambda:us-east-2:123456789012:layer:my-layer:2
\arn:aws:lambda:us-east-2:123456789012:layer:other-layer:5
通过函数访问层内容
如果 Lambda 函数包含层,Lambda 会将层的内容提取到函数执行环境中的 /opt
目录。Lambda 按函数列出的顺序(从低到高)提取层。Lambda 以相同的名称合并文件夹,因此如果同一文件出现在多个层中,函数将使用上次提取的层中的版本。
每个 Lambda 运行时将特定的 /opt
目录文件夹添加到 PATH 变量。您的函数代码无需指定路径即可访问层内容。有关 Lambda 执行环境中路径设置的更多信息,请参阅 定义运行时环境变量。
查找层信息
要在Amazon账户中查找与 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", ] } } ] }
要列出账户中的所有层,您可以省略 --compatible-runtime
选项。响应中的详细信息反映层的最新版本。
您还可以使用 list-layer-versions 命令获取层的最新版本。
aws lambda list-layer-versions --layer-name my-layer --query 'LayerVersions[0].LayerVersionArn
添加层权限
要将 Lambda 函数与层结合使用,您需要具有对层版本调用 GetLayerVersion API 操作的权限。对于您 Amazon 账户中的函数,可通过您的用户策略新增此权限。
要在另一个账户中使用层,该账户的拥有者必须在基于资源的策略中授予您的账户权限。
有关示例,请参阅 向其他账户授予层访问权。
使用 Amazon SAM 向函数添加层
要自动在您的应用程序中创建和映射层,请使用 Amazon Serverless Application Model (Amazon SAM)。AWS::Serverless::LayerVersion
资源类型创建一个层版本,您可以从自己的 Lambda 函数配置中引用该版本。
例 blank-nodejs/template.yml – 无服务器资源
AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: An Amazon 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 Amazon 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
当您更新依赖关系和部署时,Amazon SAM 会创建层的新版本并更新映射。
示例应用程序
本指南的 GitHub 存储库提供了空白示例应用程序,演示了如何使用层来管理依赖关系。
-
Node.js – blank-nodejs
-
Python – blank-python
-
Ruby – blank-ruby
-
Java – blank-java
有关空白示例应用程序的更多信息,请参阅 Amazon Lambda 的 Blank 函数示例应用程序。有关其他示例,请参阅Lambda 示例应用程序。