我刚刚开始使用SAM使用无服务器AWS并遇到以下问题:
SAM调用似乎找不到我的lambda处理程序正在导入的python模块,但是我可以否则导入该模块。
我项目的结构是:
root-dir /
我正在python3.6虚拟环境中工作,并且已经使用设置工具安装了python软件包(mymodulename):
python setup.py develop
因此,如果我在虚拟环境中冻结了一点,我会看到:
Pillow==6.0.0
PyPDF2==1.26.0
reportlab==3.5.20
mymodulename==0.5.0
如果我也去
cd root-dir/aws/sam/
python
>>> import mymodulename
成功。因此它位于python路径上。
但是当我在本地调用sam时:
sam local invoke MyAWSServiceFunction --event ../sam/test/test_event.json
我收到错误消息:
2019-05-02 09:19:17 Found credentials in shared credentials file: ~/.aws/credentials
2019-05-02 09:19:18 Invoking app.lambda_handler (python3.6)
Fetching lambci/lambda:python3.6 Docker container image......
2019-05-02 09:19:19 Mounting /home/myname/root-dir/aws/sam/myawsservice as /var/task:ro,delegated inside runtime container
START RequestId: 245daefe-ecfb-4530-9d15-cf07f55e0f3d Version: $LATEST
Unable to import module 'app': No module named 'mymodulename'
END RequestId: 245daefe-ecfb-4530-9d15-cf07f55e0f3d
REPORT RequestId: 245daefe-ecfb-4530-9d15-cf07f55e0f3d Duration: 31 ms
Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 19 MB
{"errorMessage": "Unable to import module 'app'"}
这是我的 app.py 的代码:
from mymodulename.mymodule import mymodulefunction
def lambda_handler(event, context):
return mymodulefunction(event['body'])
我可以从单元测试中运行上面的代码,而不能在sam invoke环境中运行。
template.yaml:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: > something
Globals:
Function:
Timeout: 3
Resources:
MyAWSServiceFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: myawsservice/
Handler: app.lambda_handler
Runtime: python3.6
帮助表示赞赏。
编辑:
一种解决方法是将app.py,requirements.txt和template.yaml放在根目录中,然后执行以下操作:
sam build
这会将第3方依赖项和我自己的python模块存储在一起,并且template.py现在可以在sam本地调用期间找到它。
但是,这对于较大的项目不切实际,我想目前的答案可能是this。尽管这是用于serverless.yaml。我不确定SAM是否支持此语法。猜不出来
答案 0 :(得分:1)
这个问题提出以来已经有很长时间了,但这可能对某人有所帮助。我如何解决它:
mymodulename/
移至mymodulename/mymodulename/__init__.py
mymodulename
中创建一个setup.py
,他将负责创建一个名为mymodulename
的程序包requirements.txt
中添加以下内容:-e mymodulename/
-e
引用了您的本地代码,这个link可能也有帮助。