我正试图找到使用Python进行健壮的无服务器开发的最佳方法。该项目使用无服务器框架将其划分为多个服务,并在一个monorepo中进行版本化。这是我想要的结构:
module_a和module_b由共享逻辑组成,这两个服务都应该可用。到目前为止,我已经找到了两种方法:将共享代码包装在一个可安装的包中,并通过pip将其注入服务,或者作为一个层提供共享代码。这两种解决方案都有缺陷,最重要的是,不可能迅速开发该应用程序,因为任何更改都需要pip。我注意到这个问题在Node.js中得到了解决,并且有许多关于Python的问题没有得到回答。
有插件 -无服务器包-常见,这似乎解决了这个问题,然而,它看起来不像一种先行的方法。
我感谢任何形式的帮助。
发布于 2020-06-18 23:41:04
也许你可以考虑使用Lambda层。您可以在这里找到一个快速指南:链接。
让我举个简单的例子。这个例子有两个无服务器项目-- library
有共享代码,service
有服务代码。
library
-这个项目应该有下面的文件结构。这个项目的根目录中有serverless.yml
和另一个将作为模块导出的文件夹。当您在python中使用lambda时,python
将被链接并让lambda找到您的模块。./
└ serverless.yml
└ common/
└ python/
└ Common.py
serverless.yml -正如您所看到的,文件夹common
在这里显式声明为要导出。请注意,在资源中重用层名称Common
,而无服务器框架将自动将其与资源引用匹配。
service: library
provider:
name: aws
runtime: python3.7
stage: dev
region: ap-northeast-1
layers:
Common:
path: common
resources:
Outputs:
CommonLayerExport:
Value:
Ref: CommonLambdaLayer
Export:
Name: CommonLambdaLayer
公共/python/Common.py (printException
是共享函数的一个示例,将用于另一个项目)
import sys
import traceback
import os
def printException(exception, writer=None):
if writer is None:
writer = print
top = traceback.extract_tb(sys.exc_info()[2])[-1]
writer(", ".join([type(exception).__name__, str(sys.exc_info()[1]), os.path.basename(top[0]), str(top[1])]))
service
serverless.yml --正如您所看到的,每个函数都应该包含层,并且可以引用带有CloudFormation引用的特定层。service: layer-test
provider:
name: aws
region: ap-northeast-1
runtime: python3.7
stage: dev
functions:
exceptionExample:
handler: handler.func
layers:
- ${cf:library-dev.CommonLayerExport}
events:
- http:
path: exceptionExample
method: get
handler.py -现在我们可以很容易地从共享层导入共享模块。
import json
import Common
def func(event, context):
try:
1/0 # just to raise an exception and test the shared function
except Exception as e:
Common.printException(e)
response = {
"statusCode": 200,
}
return response
您应该注意的一点是,由于lambda层没有打包导入的模块,所以您也应该导入您的层在服务中使用的模块。
https://stackoverflow.com/questions/61158117
复制