无服务器 - 包依赖项



在上一章中,我们学习了如何在无服务器框架中使用插件。我们特别关注了 Python Requirements 插件,并了解了如何将其用于将 numpy、scipy、pandas 等依赖项与 Lambda 函数的应用程序代码捆绑在一起。我们甚至看到了一个需要 numpy 依赖项的函数部署示例。我们看到它在本地运行良好,但在 AWS Lambda 控制台中,如果您使用的是 Windows 或 Mac 机器,则会遇到错误。让我们了解为什么该函数可以在本地运行,但在部署后却无法运行。

如果您查看错误消息,您会得到一些提示。我特别指的是一行——“导入 numpy C 扩展失败”。现在,许多重要的 Python 包(如 numpy、pandas、scipy 等)都需要编译 C 扩展。如果我们在 Windows 或 Mac 机器上编译它们,那么 Lambda(Linux 环境)在尝试加载它们时会抛出错误。所以重要的问题是,如何避免此错误?Docker 闪亮登场!

什么是 Docker?

根据 维基百科,Docker 是一 *套平台即服务 (PaaS) 产品,它使用操作系统级虚拟化来将软件交付到称为容器的包中。*如果您进一步浏览 Docker 的维基百科页面,您会发现一些更相关的陈述——*Docker 可以将应用程序及其依赖项打包到可以在任何 Linux、Windows 或 macOS 计算机上运行的虚拟容器中。这使应用程序能够在各种位置运行,例如本地、公共云和/或私有云。*我认为在上述陈述之后应该非常清楚。我们出现错误是因为在 Windows/Mac 上编译的 C 扩展在 Linux 中不起作用。

我们可以通过将应用程序打包到可以在任何操作系统上运行的容器中来简单地绕过该错误。Docker 在后台为了实现这种操作系统级虚拟化所做的事情超出了本章的范围。

安装 Docker

您可以访问 https://docs.docker.net.cn/engine/install/ 来安装 Docker Desktop。如果您使用的是 Windows 10 家庭版,则 Windows 版本应 至少为 1903(2019 年 5 月更新)。因此,您可能需要在安装 Docker Desktop 之前升级您的 Windows 10 操作系统。Windows 专业版或企业版没有此类限制。

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

在无服务器框架中使用 dockerizePip

在您的机器上安装 Docker Desktop 后,您只需要在您的 serverless.yml 文件中添加以下内容即可使用 Docker 打包您的应用程序和依赖项:

custom:
   pythonRequirements:
      dockerizePip: true

请注意,如果您从上一章开始就一直跟着我做,您很可能已经将代码部署到 Lambda 一次了。这会在您的本地存储中创建一个静态缓存。默认情况下,无服务器框架会使用该缓存来捆绑依赖项,因此不会创建 Docker 容器。因此,为了强制无服务器框架使用 Docker,我们将向 pythonRequirements 添加另一个语句:

custom:
   pythonRequirements:
      dockerizePip: true
	useStaticCache: false #not necessary if you will be deploying the code to lambda for the first time.

如果您是第一次部署到 Lambda,则不需要最后一条语句。通常,您应该将 useStaticCache 设置为 true,因为这会在您没有更改依赖项或打包方式时节省一些打包时间。

通过这些添加,serverless.yml 文件现在如下所示:

service: hello-world-python
provider:
   name: aws
   runtime: python3.6
   profile: yash-sanghvi
   region: ap-south-1

functions:
   hello_world:
      handler: handler.hello
      timeout: 6
      memorySize: 128
	
plugins:
   - serverless-python-requirements
  
custom:
   pythonRequirements:
      dockerizePip: true
	useStaticCache: false #not necessary if you will be deploying the code to lambda for the first time.
  

现在,当您运行 **sls deploy -v** 命令时,请确保 Docker 在后台运行。在 Windows 上,您只需在“开始”菜单中搜索 Docker Desktop 并双击该应用程序即可。您很快就会收到一条消息,表明它正在运行。您也可以通过 Windows 中电池图标附近的弹出窗口来验证这一点。如果您可以看到那里的 Docker 图标,则表示它正在运行。

Docker

现在,当您在 AWS Lambda 控制台上运行您的函数时,它应该可以工作了。恭喜!!

但是,在 AWS Lambda 控制台上的“函数代码”部分,您会看到一条消息,提示“Lambda 函数“hello-world-python-dev-hello_world”的部署包太大,无法启用内联代码编辑。但是,您仍然可以调用您的函数。”

Function Code

看来添加 Numpy 依赖项使捆绑包大小过大,因此我们甚至无法在 Lambda 控制台中编辑我们的应用程序代码。我们如何解决这个问题?请阅读下一章以了解详情。

参考文献

广告