使用Serverless框架将Python代码共享为lambda层



这是一个后续问题:这个问题

我正在尝试使用无服务器框架将一些共享的Python代码作为lambda层上传到AWS lambda。

我遵循了@msc的解决方案(经过一些修改(:

项目1:

步骤1:创建一个具有以下结构的无服务器项目:

./
└ serverless.yml
└ common/
└ python/
└ Other packages as per requirements.txt
└ my_shared_script.py - my own package

步骤2:设置我的.yml文件:

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

步骤3:将我的需求安装到common/python/文件夹中:

requirements.txt:

pandas==1.0.5

将要求安装到文件夹:pip install -r requirements.txt ./common/python/

项目2

步骤1:在我的.yml文件中引用项目1中的上传层:

functions:
hello:
handler: handler.hello
layers:
- arn:aws:lambda:ap-southeast-1:182739821739:layer:Common:1

步骤2:所有导入现在都可以工作。来自我的handler.py:

import pandas
import my_shared_script
def hello(event, context):
print(my_shared_script.foo())

函数foo()按预期运行。


我现在的问题是,my_shared_script.py现在与所有安装的Python包都在同一个文件夹中(有很多文件和文件夹(,这使得我很难找到和维护自己的模块/脚本。

./
└ serverless.yml
└ common/
└ python/
└ Other packages as per requirements.txt
└ lib/
└ my_shared_script.py - my own package

对我来说,将自己的脚本放在一个单独的文件夹/lib中并将所有其他需求安装到/python文件夹中是有意义的。

但是,如果我使用上面的文件夹结构,代码就会失败。

我已经把它放在项目2中handler.py的顶部,希望脚本能够在/lib中找到我的代码。

import os
import sys
CWD = os.path.dirname(os.path.realpath(__file__))
sys.path.insert(0, os.path.abspath(os.path.join(CWD, "../lib")))

我很难理解这个无服务器框架中的Python路径/文件夹结构。。。希望一些专家能分享他们的解决方案,谢谢。

试试这个

import pandas
import sys
try:
sys.path.index('/opt/lib')
except ValueError:
sys.path.append('/opt/lib')
import my_shared_script
def hello(event, context):
print(my_shared_script.foo())

最新更新