运行 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__.pymymodulename 中创建一个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?

AWS SAM:请求的资源响应中不存在“Access-Control-Allow-Origin”标头

Visual Studio 代码调试器未连接到 SAM Local