无服务器 – 层创建

无服务器 – 层创建


什么是图层?

层是隔离代码块的一种方式。假设您要在应用程序中导入 NumPy 库。您信任该库,并且几乎不可能对该库的源代码进行更改。因此,如果 NumPy 的源代码弄乱了您的应用程序工作区,您将不会喜欢它。粗略地说,您只是希望 NumPy 位于其他地方,与您的应用程序代码隔离。图层允许您做到这一点。您可以简单地将所有依赖项(NumPy、Pandas、SciPy 等)捆绑在一个单独的层中,然后在无服务器中的 lambda 函数中简单地引用该层。和繁荣!该层中捆绑的所有库现在都可以导入到您的应用程序中。同时,您的应用程序工作区保持完全整洁。

层 ARN

Iva RajovicUnsplash拍摄的照片,表示层中的代码分离

层真正酷的地方在于它们可以跨功能共享。假设您使用包含 NumPy 和 Pandas 的 python-requirements 层部署了一个 lambda 函数。现在,如果另一个 lambda 函数需要 NumPy,则无需为此函数部署单独的层。您可以简单地使用前一个函数的图层,它也可以很好地与新函数配合使用。

这将在部署期间为您节省大量宝贵的时间。毕竟,您将只部署应用程序代码。依赖项已经存在于现有层中。因此,一些开发人员将依赖层保留在单独的堆栈中。然后他们在所有其他应用程序中使用该层。这样,他们就不需要一次又一次地部署依赖项。毕竟,依赖是相当沉重的。NumPy 库本身大约是。80 MB 大。每次更改应用程序代码(可能只有几 KB)时都部署依赖项将非常不方便。

添加依赖层只是一个例子。还有其他几个用例。例如,serverless.com 上给出的示例涉及使用 FFmpeg 工具创建 GIF。在那个例子中,他们将 FFmpeg 工具存储在一个层中。总之,AWS Lambda 允许我们为每个函数添加最多 5 个层。唯一的条件是 5 层和应用程序的总大小应小于 250 MB。

创建 python-requirements 层

现在让我们看看如何使用无服务器创建和部署包含所有依赖项的层。为此,我们需要serverless -python-requirements插件。该插件仅适用于 Serverless 1.34 及更高版本。因此,如果您的版本低于 1.34,您可能需要升级无服务器版本。您可以使用安装插件 –

sls plugin install -n serverless-python-requirements

接下来,您在 serverless.yml 的 plugins 部分中添加此插件,并在自定义部分中提及它的配置 –

plugins:
   - serverless-python-requirements
custom:
   pythonRequirements:
      dockerizePip: true
      layer: true

在这里,dockerizePiptrue启用了docker的使用,并允许您将所有依赖项打包到docker容器中。我们在上一章讨论过使用 docker 打包。layertrue告诉无服务器,python 需求应该存储在一个单独的层中。现在,此时,您可能想知道无服务器如何理解要打包哪些依赖项?正如插件章节中提到的,答案就在 requirements.txt 文件中。

定义层插件和自定义配置后,您可以将层添加到无服务器中的各个功能中,如下所示 –

functions:
   hello:
      handler: handler.hello
      layers:
         - { Ref: PythonRequirementsLambdaLayer }

关键字PythonRequirementsLambdaLayer来自CloudFormation Reference。通常,它派生自层的名称。语法为“LayerNameLambdaLayer”(TitleCased,无空格)。在我们的例子中,由于层名称是 python 要求,引用变为 PythonRequirementsLambdaLayer。如果您不确定 lambda 层的名称,您可以通过以下步骤获取它 –

  • 运行sls 包

  • 打开 .serverless/cloudformation-template-update-stack.json

  • 搜索“LambdaLayer”

使用同一区域中另一个函数的现有图层

就像我在开头提到的那样,层的一个非常酷的地方是能够在您的函数中使用现有层。这可以通过使用现有层的 ARN 轻松完成。使用 ARN 将现有层添加到函数的语法非常简单 –

functions:
   hello:
      handler: handler.hello
      layers:
         - arn:aws:lambda:region:XXXXXX:layer:LayerName:Y

就是这样。现在,具有指定 ARN 的层将与您的函数一起使用。如果该层包含 NumPy 库,您可以简单地继续并在您的“hello”函数中调用import numpy它将运行而不会出现任何错误。

如果您想知道从哪里可以获得 ARN,实际上很简单。只需导航到 AWS 控制台中包含层的函数,然后单击“层”。

层 ARN

当然,如果图层不属于您的帐户,则需要公开共享或专门与您的帐户共享。稍后再谈。

此外,请记住该层应与您的应用程序兼容。不要期望与 node.js 运行时兼容的层与在 python3.6 运行时中创建的函数一起运行。

非需求/通用层

正如开头所提到的,这些层的主要功能是隔离您的代码块。因此,它们不需要只包含依赖项。它们可以包含您指定的任何代码段。调用layer: true自定义中的pythonRequirements是一种由serverless -python-requirements插件实现的快捷方式然而,要创建一个通用层,serverless.yml 中的语法,如serverless docs 中所述,如下 –

layers:
   hello:
      path: layer-dir # required, path to layer contents on disk
      name: ${opt:stage, self:provider.stage, 'dev'}-layerName # optional, Deployed Lambda layer name
      description: Description of what the lambda layer does # optional, Description to publish to AWS
      compatibleRuntimes: # optional, a list of runtimes this layer is compatible with
         - python3.8
      licenseInfo: GPLv3 # optional, a string specifying license information
      # allowedAccounts: # optional, a list of AWS account IDs allowed to access this layer.
      #   - '*'
      # note: uncommenting this will give all AWS users access to this layer unconditionally.
      retain: false # optional, false by default. If true, layer versions are not deleted as new ones are created

由于提供的注释,各种配置参数是不言自明的。除了“路径”,所有其他属性都是可选的。path 属性是您要与应用程序代码隔离的所选目录的路径。它将被压缩并发布为您的图层。例如,在serverless 上示例项目中,他们在一个层中托管 FFmpeg 工具,他们将该工具下载到名为“layer”的单独文件夹中,并在 path 属性中指定。

layers:
   ffmpeg:
      path: layer

如前所述,我们最多可以在图层– 属性中添加 5 个图层

要在您的函数中使用这些通用层,您可以再次使用 CloudFormation 参考或指定 ARN。

允许其他帐户访问图层

只需在“allowedAccounts”属性中提及帐号,就可以为更多帐户提供访问您的图层的权限。例如 –

layers:
   testLayer:
      path: testLayer
      allowedAccounts:
         - 999999999999 # a specific account ID
         - 000123456789 # a different specific account ID

如果您希望该图层可公开访问,您可以在 allowedAccounts 中添加“*” –

layers:
   testLayer:
      path: testLayer
      allowedAccounts:
      - '*'

参考

觉得文章有用?

点个广告表达一下你的爱意吧 !😁