Python 3.x Python在运行AWS sam本地调用时未找到模块
我刚开始使用SAM使用AWS serverless,遇到以下问题: SAM invoke似乎找不到lambda处理程序正在导入的python模块,但我可以以其他方式导入该模块 我的项目的结构是: 根目录/Python 3.x Python在运行AWS sam本地调用时未找到模块,python-3.x,aws-lambda,aws-serverless,Python 3.x,Aws Lambda,Aws Serverless,我刚开始使用SAM使用AWS serverless,遇到以下问题: SAM invoke似乎找不到lambda处理程序正在导入的python模块,但我可以以其他方式导入该模块 我的项目的结构是: 根目录/ mymodulename/ mymodule.py aws/ sam/ 模板yaml 亚马尔 myawsservice/ app.py 测试/ test_event.json 我在python3.6虚拟环境中工作,并使用安装工具安装了python包(mymodulena
- mymodulename/
- mymodule.py
- mymodule.py
- aws/
- sam/
- 模板yaml
- 亚马尔
- myawsservice/
- app.py
- app.py
- 测试/
- test_event.json
- sam/
python setup.py develop
因此,如果我在虚拟环境中执行pip冻结,我会看到:
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调用环境运行
模板。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
谢谢你的帮助
编辑:
from mymodulename.mymodule import mymodulefunction
def lambda_handler(event, context):
return mymodulefunction(event['body'])
一种解决方法是将app.py、requirements.txt和template.yaml放在根目录中,然后执行以下操作:
sam build
这将把第三方依赖项和我自己的python模块存储在一起,template.py现在可以在sam本地调用期间找到它
然而,这对于更大的项目来说并不实际,我想现在的答案可能是这样的。尽管这是针对一个serverless.yaml的。我不确定SAM是否支持这种语法。猜不到。这个问题已经有很长一段时间没有公开了,但它可能会对某些人有所帮助。我是如何修复的:
- 将代码从
移动到mymodulename/
mymodulename/mymodulename/\uuu init\uuuu.py
- 在
中创建一个mymodulename
谁将负责创建一个名为setup.py
mymodulename
- 在lambda函数的
中添加以下内容:requirements.txt
-e mymodulename/
-e
引用了您的本地代码,这可能也会有所帮助。您尝试过使用lambda层吗?您可以将第三方LIB与创建的任何其他LIB一起部署到lambda层,并将该层导入lambda函数。你能分享你的setup.py吗?我面临着同样的问题