Mar*_*ano 7 python aws-lambda serverless
我正在尝试寻找使用 Python 进行稳健无服务器开发的最佳方法。该项目使用无服务器框架分为多个服务,并在一个 monorepo 中进行版本控制。这是我想要的结构:
module_a 和 module_b 包含共享逻辑,应该可用于这两个服务。到目前为止,我发现了 2 种方法:将共享代码包装在一个可安装的包中并通过 pip 将其注入服务或提供共享代码作为一个层。两种解决方案都有缺陷,最重要的是无法快速开发应用程序,因为任何更改都需要 pip。我注意到这个问题在 Node.js 中得到了解决,并且还有很多关于 Python 的未解答的问题。
有一个插件- serverless-package-common,它似乎解决了这个问题,但是,它看起来不像是一种优先的方法。
我感谢任何形式的帮助。
也许你可以考虑使用Lambda层。您可以在这里找到快速指南:链接。
\n\n让我给你举一个简单的例子。此示例有两个无服务器项目 -library一个具有共享代码,service一个具有服务代码。
library- 该项目应具有以下文件结构。您serverless.yml在该项目的根目录中有另一个文件夹,该文件夹将作为模块导出。python当您将 lambda 与 python 一起使用时,将被链接并让 lambda 找到您的模块。./\n\xe2\x94\x94 serverless.yml\n\xe2\x94\x94 common/\n \xe2\x94\x94 python/\n \xe2\x94\x94 Common.py\nRun Code Online (Sandbox Code Playgroud)\n\nserverless.yml - 如您所见,common此处明确声明要导出的文件夹。请注意,层名称Common在资源中重复使用,无服务器框架会自动将其与资源引用相匹配。
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\nRun Code Online (Sandbox Code Playgroud)\n\ncommon/python/Common.py(printException是将在另一个项目中使用的共享函数的示例)
./\n\xe2\x94\x94 serverless.yml\n\xe2\x94\x94 common/\n \xe2\x94\x94 python/\n \xe2\x94\x94 Common.py\nRun Code Online (Sandbox Code Playgroud)\n\nservice\nserverless.yml - 正如您所看到的,每个函数都应包含层,您可以使用 CloudFormation 引用来引用特定层。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\nRun Code Online (Sandbox Code Playgroud)\n\nhandler.py - 现在我们可以轻松地从共享层导入共享模块。
\n\nservice: 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\nRun Code Online (Sandbox Code Playgroud)\n\n您应该注意的一件事是,由于 lambda 层不打包导入的模块,因此您也应该导入您的服务中的层使用的模块。
\n| 归档时间: |
|
| 查看次数: |
683 次 |
| 最近记录: |