无服务器 – 层创建
无服务器 – 层创建
什么是图层?
层是隔离代码块的一种方式。假设您要在应用程序中导入 NumPy 库。您信任该库,并且几乎不可能对该库的源代码进行更改。因此,如果 NumPy 的源代码弄乱了您的应用程序工作区,您将不会喜欢它。粗略地说,您只是希望 NumPy 位于其他地方,与您的应用程序代码隔离。图层允许您做到这一点。您可以简单地将所有依赖项(NumPy、Pandas、SciPy 等)捆绑在一个单独的层中,然后在无服务器中的 lambda 函数中简单地引用该层。和繁荣!该层中捆绑的所有库现在都可以导入到您的应用程序中。同时,您的应用程序工作区保持完全整洁。
由Iva Rajovic在Unsplash上拍摄的照片,表示层中的代码分离
层真正酷的地方在于它们可以跨功能共享。假设您使用包含 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
在这里,dockerizePip – true启用了docker的使用,并允许您将所有依赖项打包到docker容器中。我们在上一章讨论过使用 docker 打包。layer – true告诉无服务器,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 控制台中包含层的函数,然后单击“层”。
当然,如果图层不属于您的帐户,则需要公开共享或专门与您的帐户共享。稍后再谈。
此外,请记住该层应与您的应用程序兼容。不要期望与 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: - '*'
参考