Serverless教程

Serverless 打包依赖

在上一章中,我们看到了如何在Serverless中使用插件。我们专门研究了 Python 需求插件,并了解了它如何用于将 numpy、scipy、pandas 等依赖项与 lambda 函数的应用程序代码捆绑在一起。我们甚至看到了部署需要 numpy 依赖项的函数的示例。我们看到它在本地运行良好,但在 AWS Lambda 控制台上,如果您使用的是 Windows 或 Mac 计算机,则会遇到错误。让我们了解为什么该函数在本地运行但在部署后不运行。
如果您查看错误消息,您会得到一些提示。我特别指的是一行-"导入 numpy C 扩展失败。"现在,很多重要的python包,如numpy、pandas、scipy等,都需要C-extensions的编译。如果我们在 Windows 或 Mac 机器上编译它们,那么 Lambda(linux 环境)在尝试加载它们时会抛出错误。所以重要的问题是,可以做些什么来避免这个错误。进来码头!

什么是docker?

根据维基百科,docker是一个 一组平台即服务 (PaaS) 产品,它们使用操作系统级虚拟化以称为容器的包形式交付软件。 如果您多浏览 docker 的 Wikipedia 页面,您会发现一些相关声明- Docker 可以将应用程序及其依赖项打包到可以在任何 Linux、Windows 或 macOS 计算机上运行的虚拟容器中。这使应用程序能够在各种位置运行,例如本地、公共云和/或私有云。 我认为看完上述陈述应该很清楚了。我们出现错误,因为在 Windows/Mac 上编译的 C 扩展在 Linux 中不起作用。
我们可以通过将应用程序打包在可以在任何操作系统上运行的容器中来简单地绕过该错误。 docker 在后台做什么来实现这种操作系统级的虚拟化超出了本章的范围。

安装docker

您可以前往https://docs.docker.com/engine/install/ 用于安装 Docker Desktop。如果您使用的是 Windows 10 家庭版,则 Windows 版本应为 至少 1903(2019 年 5 月更新)。因此,您可能需要在安装 Docker Desktop 之前升级您的 Windows 10 操作系统。此类限制不适用于 Windows Pro 或 Enterprise 版本。

在Serverless中使用 dockerizePip

在您的机器上安装了 Docker Desktop 后,您只需在 serverless.yml 文件中添加以下内容即可使用 docker 打包您的应用程序和依赖项-
custom:
   pythonRequirements:
      dockerizePip: true
请注意,如果你从上一章开始就一直跟着我,很可能你已经将代码部署到 lambda 一次。这会在你的本地存储中创建一个静态缓存。默认情况下,serverless 将使用该缓存来捆绑依赖项,因此不会创建 docker 容器。因此,为了强制 serverless 创建使用 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 桌面并双击该应用程序即可。您很快就会收到一条消息,表明它正在运行。您还可以通过 Windows 中电池图标附近的小弹出窗口来验证这一点。如果你能在那里看到泊坞窗图标,它正在运行。
Docker
现在,当您在 AWS Lambda 控制台上运行您的函数时,它会起作用。恭喜!!
但是,在 AWS Lambda 控制台的"函数代码"部分,您会看到一条消息,指出"您的 Lambda 函数"hello-world-python-dev-hello_world"的部署包太大,无法启用内联代码编辑。但是,您仍然可以调用您的函数。'
函数代码
似乎添加 Numpy 依赖项使包大小过大,因此我们甚至无法在 lambda 控制台中编辑我们的应用程序代码。我们如何解决这个问题?前往下一章了解详情。

参考文献

Docker 桌面 Serverless Python 要求
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4