运行 AWS sam 本地调用时 Python 未找到模块
Posted
技术标签:
【中文标题】运行 AWS sam 本地调用时 Python 未找到模块【英文标题】:Python not finding module when running AWS sam local invoke 【发布时间】:2019-09-20 18:04:56 【问题描述】:我刚开始使用 SAM 使用 AWS 无服务器并遇到以下问题:
SAM 调用似乎找不到我的 lambda 处理程序正在导入的 python 模块,但我可以导入该模块。
我的项目的结构是:
根目录/
我的模块名/ mymodule.py aws/ 山姆/ template.yaml packaged.yaml myawsservice/ app.py 测试/ test_event.json我在 python3.6 虚拟环境中工作,我已经使用安装工具安装了我的 python 包(mymodulename):
python setup.py develop
因此,如果我在虚拟环境中执行 pip freeze,我会看到:
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 调用环境中运行。
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 是否支持这种语法。估计不行。
【问题讨论】:
你试过使用 lambda 层吗?您可以将 3rd 方库与您创建的任何其他库一起部署到 lambda 层,并将该层导入您的 lambda 函数。 docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html 【参考方案1】:自从这个问题被打开以来已经有很长时间了,但它可能对某人有所帮助。我是如何解决的:
将您的代码从mymodulename/
移动到mymodulename/mymodulename/__init__.py
在mymodulename
中创建一个setup.py
,他将负责创建一个名为mymodulename
的包
在您的 lambda 函数的 requirements.txt
中添加:-e mymodulename/
-e
引用您的本地代码,这个link 可能也有帮助。
【讨论】:
你能分享你的 setup.py 吗?我也面临同样的问题以上是关于运行 AWS sam 本地调用时 Python 未找到模块的主要内容,如果未能解决你的问题,请参考以下文章
AWS SAM-获取错误消息:pywintypes.error:(5,'CreateFile','访问被拒绝。')
AWS SAM CLI 全新安装引发错误 - dyld:未加载库:@executable_path/../.Python
如何从 AWS SAM 本地 docker 实例连接到主机 MySQL?
AWS CDK - 如何在本地运行 API 和 Lambda?