无服务器 - 插件


随着无服务器的普及,针对利基用户案例的更多功能的需求自然会增加。这些需求都是通过插件来满足的。顾名思义,插件是可选的,您只需安装您需要的插件。在本章中,我们将了解如何访问可用于 Serverless 的几个插件、如何安装这些插件以及如何在 serverless.yml 中引用它们。

浏览插件列表

所有可用于 Serverless 的插件都可以在www.serverless.com/plugins/上找到

您可以在这里搜索插件。例如,如果您搜索“Python”,您将看到几个专门为 python 运行时开发的插件。它们按照受欢迎程度排列。

插件

让我们看看最流行的 python 插件(在撰写本文时):Python 要求。单击该插件。这将打开与该插件相关的详细文档。

无服务器 Python 要求

本文档涵盖了两个最重要的方面 - 安装插件并在 serverless.yml 中引用它。对于任何插件都是如此。你只需要打开它的文档就可以知道该插件的安装和使用。回到 Python 需求插件,文档指出该插件会自动捆绑requirements.txt 中的依赖项,并使它们在您的 PYTHONPATH 中可用。

换句话说,如果您的 lambda 函数需要其他依赖项,例如 pandas、numpy、matplotlib 等,您只需在与 serverless.yml 文件位于同一文件夹中的 requests.txt 文件中指定这些依赖项。然后这个插件将完成剩下的工作。您甚至可以在requirements.txt中指定库的版本号。例如,示例requirements.txt文件如下所示:

aws-psycopg2==1.2.1
boto
boto3==1.7.62
botocore==1.10.62
numpy==1.14.5
pandas==0.25.0
scipy==1.5.2
sqlalchemy==1.2.15

正如您所看到的,您可以仅提及依赖项名称,也可以添加版本号(用 == 符号分隔)。当然,依赖项以及应用程序代码的大小不应超过 250 MB。因此,仅包含您实际需要的依赖项至关重要。

现在,让我们回到我们的插件。我们已准备好requirements.txt 文件。下一步是安装插件。打开命令提示符并导航到包含 serverless.yml 文件的项目文件夹。然后,按照文档,运行以下命令来安装插件 -

sls plugin install -n serverless-python-requirements

事实上,如果您将serverless-python-requirements替换为任何其他插件名称,上述命令仍然适用于大多数插件。但是,建议您在安装新插件时遵循文档中给出的安装命令。当您运行上述命令时,您应该看到类似于下图中的消息 -

SLS 插件安装

如您所见,在项目文件夹中创建了一个packages.json 文件。如果项目文件夹中存在packages.json 文件,则会对其进行编辑以包含上述插件。此外,serverless.yml 文件将自动进行编辑以包含已安装的插件。如果您现在打开 serverless.yml 文件,您应该会看到添加了以下几行 -

plugins:
   - serverless-python-requirements

这意味着 serverless.yml 中插件的引用是自动完成的。有几个与此插件相关的设置,可以在文档中找到。我们将在下一章介绍与“交叉编译”相关的设置。不过现在让我们看看使用这个插件的效果。我在我的requirements.txt中添加了numpy。这就是我的 handler.py 文件的样子 -

import time
import numpy

def hello(event, context):
   print("second update!")
   time.sleep(4)
   print(numpy.random.randint(100))
   return("hello")

现在让我将其部署到 lambda。您应该会看到类似于下图中的消息。重点关注包装的尺寸。现在它> 14 MB(这是压缩包的大小),而不是添加插件之前的约10 kB,因为numpy依赖项也被捆绑在一起。

部署

这证明依赖项现在与应用程序代码捆绑在一起。您可以使用sls invoke local -f function_name在本地测试它。如果您是 Windows 或 Mac 用户,在 AWS Lambda 控制台上测试部署的 lambda 函数很可能会抛出错误,类似于下面给出的错误 -

Unable to import module 'handler': 

IMPORTANT: PLEASE READ THIS FOR ADVICE ON HOW TO SOLVE THIS ISSUE!

Importing the numpy C-extensions failed. This error can happen for
many reasons, often due to issues with your setup or how NumPy was
installed.

We have compiled some common reasons and troubleshooting tips at:

   https://numpy.org/devdocs/user/troubleshooting-importerror.html

Please note and check the following:

  * The Python version is: Python3.8 from "/var/lang/bin/python3.8"
  * The NumPy version is: "1.19.4"

and make sure that they are the versions you expect.
Please carefully study the documentation linked above for further help.

Original error was: No module named 'numpy.core._multiarray_umath'

请继续阅读下一章,了解有关发生此错误的原因以及如何处理的更多信息。