将层与 Lambda 函数结合使用 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

将层与 Lambda 函数结合使用

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

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

将函数配置为使用层

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

如果您的函数使用了其他 Amazon 账户发布的层,则函数可以在删除层版本后或在撤消访问该层的权限后继续使用该层版本。但是,您无法创建使用已删除层版本的新函数。

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

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

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

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

要指定要使用的层版本,您必须提供每个层版本的完整 Amazon Resource Name (ARN)。在将层添加到已具有层的函数时,将覆盖之前的层列表。请务必在每次更新层配置时都包括所有层。或者,要删除所有层,请指定空列表。

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

层的创建者可以删除层的某个版本。如果您正在函数中使用该层版本,则函数将继续运行,就像层版本仍然存在一样。但在更新层配置时,必须先删除对已删除版本的引用。

访问层的内容

在 Lambda 函数中包含层时,Lambda 将层的内容提取到函数执行环境中的 /opt 目录中。Lambda 按照您指定的顺序提取层,合并具有相同名称的所有文件夹。如果同一文件出现在多个层中,则该函数将使用上次提取的层中的版本。

每个 Lambda 运行时将特定的 /opt 目录文件夹添加到 PATH 变量。您的函数代码无需指定路径即可访问层内容。有关 Lambda 执行环境中路径设置的更多信息,请参阅 定义运行时环境变量

查找层信息

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

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

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

{ "Layers": [ { "LayerName": "my-layer", "LayerArn": "arn:aws-cn:lambda:us-east-2:123456789012:layer:my-layer", "LatestMatchingVersion": { "LayerVersionArn": "arn:aws-cn: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

更新函数使用的层版本

已对层进行版本控制,每个层版本的内容是不可变的。层所有者可以发布新的层版本以提供更新的内容。

要将更新的层版本添加到函数中,请使用 update-function-configuration 命令。使用此命令的 --layers 选项可列出要添加的所有层版本。如果函数已有层,则新列表会覆盖之前的列表。

要仅更新其中一个层版本,必须在 --layers 选项中包括现有层版本的 ARN。

下面的程序假定您已将更新的层代码打包到名为 layer.zip 的本地文件中。

将更新的层版本添加到函数

  1. (可选)如果尚未发布新的层版本,请发布新版本。

    aws lambda publish-layer-version --layer-name my-layer --description "My layer" --license-info "MIT" \ --zip-file "fileb://layer.zip" --compatible-runtimes python3.6 python3.7
  2. (可选)如果函数有多个层,请获取与函数关联的当前层版本。

    aws lambda get-function-config --function-name my-function --query 'Layers[*].Arn' --output yaml
  3. 将新层版本添加到函数。在以下示例命令中,函数还具有名为 other-layer:5 的层版本:

    aws lambda update-function-configuration --function-name my-function \ --layers arn:aws-cn:lambda:us-east-2:123456789012:layer:my-layer:2 \ arn:aws-cn:lambda:us-east-2:123456789012:layer:other-layer:5

添加层权限

要将 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 存储库提供了空白示例应用程序,演示了如何使用层来管理依赖关系。

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