Serverless - 插件



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

浏览插件列表

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

您可以在此处搜索插件。例如,如果您搜索“Python”,您将看到一些专门为 Python 运行时开发的插件。它们按流行度排序。

Plugins

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

Serverless Python Requirements

此文档涵盖了两个最重要的方面——安装插件以及在 serverless.yml 中引用它。这适用于任何插件。您只需要打开其文档即可了解该插件的安装和使用方法。回到 Python Requirements 插件,文档指出此插件会自动捆绑来自 requirements.txt 的依赖项,并在您的 PYTHONPATH 中提供它们。

换句话说,如果您的 Lambda 函数需要其他依赖项(如 pandas、numpy、matplotlib 等),您只需要在 requirements.txt 文件中指定这些依赖项,该文件与您的 serverless.yml 文件位于同一文件夹中。然后,此插件将完成其余工作。您甚至可以在 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 Plugin Install

如您所见,在项目文件夹中创建了一个 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 依赖项也一起捆绑在一起了。

Deploy

这证明依赖项现在与应用程序代码一起捆绑在一起了。您可以使用 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.com.cn/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'

继续下一章以了解此错误发生的原因以及如何处理它。

广告