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

AWS Lambda 层

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

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

注意

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

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

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

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

将函数配置为使用层

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

要将层添加到函数,请使用 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": "nodejs8.10", "Role": "arn:aws:iam::123456789012:role/service-role/lambda-role", "Handler": "index.handler", "CodeSize": 402, "Description": "", "Timeout": 5, "MemorySize": 128, "LastModified": "2018-11-14T22:47:04.542+0000", "CodeSha256": "kDHAEY62Ni3OovMwVO8tNvgbRoRa6IOOKqShm7bSWF4=", "Version": "$LATEST", "TracingConfig": { "Mode": "Active" }, "RevisionId": "81cc64f5-5772-449a-b63e-12330476bcc4", "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 } ] }

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

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

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

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

管理层

要创建层,请将 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" ] }

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

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

$ aws lambda list-layers --compatible-runtime python3.7 { "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" ] } } ] }

您可以忽略运行时选项来列出所有层。响应中的详细信息反映层的最新版本。使用 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" ] }

响应中的链接可用于下载层存档,并且其有效时间为 10 分钟。要删除层版本,请使用 delete-layer-version 命令。

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

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

在层中包括库依赖项

您可通过将运行时依赖项放入层中来将这些依赖项移出函数代码。Lambda 运行时包括 /opt 目录中的路径以确保您的函数代码有权访问层中包含的库。

要在层中包含库,请将库放入运行时支持的文件夹之一。

  • Node.jsnodejs/node_modulesnodejs/node8/node_modules (NODE_PATH)

    例 适用于 Node.js 的 AWS X-Ray 开发工具包

    xray-sdk.zip └ nodejs/node_modules/aws-xray-sdk
  • Pythonpythonpython/lib/python3.7/site-packages(站点目录)

    例 Pillow

    pillow.zip │ python/PIL └ python/Pillow-5.3.0.dist-info
  • Javajava/lib(类路径)

    例 Jackson

    jackson.zip └ java/lib/jackson-core-2.2.3.jar
  • Rubyruby/gems/2.5.0 (GEM_PATH)、ruby/lib (RUBY_LIB)

    例 JSON

    json.zip └ ruby/gems/2.5.0/ | build_info | cache | doc | extensions | gems | └ json-2.1.0 └ specifications └ json-2.1.0.gemspec
  • 全部bin (PATH)、lib (LD_LIBRARY_PATH)

    例 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"}

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

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