也许您可以考虑使用 Lambda 层。您可以在此处找到快速指南:link。
让我举一个简单的例子。此示例有两个无服务器项目 - library 具有共享代码和 service 具有服务代码。
-
library - 该项目应具有以下文件结构。您在该项目的根目录中有serverless.yml,另一个文件夹将作为模块导出。 python 将被链接并让 lambda 在您将 lambda 与 python 一起使用时找到您的模块。
./
└ 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
common/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 层不打包导入的模块,你应该导入你的层在你的服务中使用的模块。