如何正确地使用 Python 在无服务器中共享代码?

Mar*_*ano 7 python aws-lambda serverless

我正在尝试寻找使用 Python 进行稳健无服务器开发的最佳方法。该项目使用无服务器框架分为多个服务,并在一个 monorepo 中进行版本控制。这是我想要的结构:

  • 服务_1/
    • 无服务器.yml
    • 处理程序
  • 服务_2/
    • 无服务器.yml
    • 处理程序
  • 共享
    • 模块_a.py
    • 模块_b.py

module_a 和 module_b 包含共享逻辑,应该可用于这两个服务。到目前为止,我发现了 2 种方法:将共享代码包装在一个可安装的包中并通过 pip 将其注入服务或提供共享代码作为一个层。两种解决方案都有缺陷,最重要的是无法快速开发应用程序,因为任何更改都需要 pip。我注意到这个问题在 Node.js 中得到了解决,并且还有很多关于 Python 的未解答的问题。

一个插件- serverless-package-common,它似乎解决了这个问题,但是,它看起来不像是一种优先的方法。

我感谢任何形式的帮助。

msc*_*msc 4

也许你可以考虑使用Lambda层。您可以在这里找到快速指南:链接

\n\n

让我给你举一个简单的例子。此示例有两个无服务器项目 -library一个具有共享代码,service一个具有服务代码。

\n\n
    \n
  1. library- 该项目应具有以下文件结构。您serverless.yml在该项目的根目录中有另一个文件夹,该文件夹将作为模块导出。python当您将 lambda 与 python 一起使用时,将被链接并让 lambda 找到您的模块。
  2. \n
\n\n
./\n\xe2\x94\x94 serverless.yml\n\xe2\x94\x94 common/\n    \xe2\x94\x94 python/\n        \xe2\x94\x94 Common.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

serverless.yml - 如您所见,common此处明确声明要导出的文件夹。请注意,层名称Common在资源中重复使用,无服务器框架会自动将其与资源引用相匹配。

\n\n
service: library\n  provider:\n    name: aws\n    runtime: python3.7\n    stage: dev\n    region: ap-northeast-1\n  layers:\n    Common:\n      path: common\n  resources:\n    Outputs:\n      CommonLayerExport:\n        Value:\n          Ref: CommonLambdaLayer\n        Export:\n          Name: CommonLambdaLayer\n
Run Code Online (Sandbox Code Playgroud)\n\n

common/python/Common.py(printException是将在另一个项目中使用的共享函数的示例)

\n\n
./\n\xe2\x94\x94 serverless.yml\n\xe2\x94\x94 common/\n    \xe2\x94\x94 python/\n        \xe2\x94\x94 Common.py\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  1. service\nserverless.yml - 正如您所看到的,每个函数都应包含层,您可以使用 CloudFormation 引用来引用特定层。
  2. \n
\n\n
service: layer-test\n  provider:\n    name: aws\n    region: ap-northeast-1\n    runtime: python3.7\n    stage: dev\n  functions:\n    exceptionExample:\n      handler: handler.func\n      layers:\n        - ${cf:library-dev.CommonLayerExport}\n      events:\n        - http:\n            path: exceptionExample\n            method: get\n
Run Code Online (Sandbox Code Playgroud)\n\n

handler.py - 现在我们可以轻松地从共享层导入共享模块。

\n\n
service: library\n  provider:\n    name: aws\n    runtime: python3.7\n    stage: dev\n    region: ap-northeast-1\n  layers:\n    Common:\n      path: common\n  resources:\n    Outputs:\n      CommonLayerExport:\n        Value:\n          Ref: CommonLambdaLayer\n        Export:\n          Name: CommonLambdaLayer\n
Run Code Online (Sandbox Code Playgroud)\n\n

您应该注意的一件事是,由于 lambda 层不打包导入的模块,因此您也应该导入您的服务中的层使用的模块。

\n