Python 3.x Python在运行AWS sam本地调用时未找到模块

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

我刚开始使用SAM使用AWS serverless,遇到以下问题:

SAM invoke似乎找不到lambda处理程序正在导入的python模块,但我可以以其他方式导入该模块

我的项目的结构是:

根目录/

  • mymodulename/
    • mymodule.py
  • aws/
    • sam/
      • 模板yaml
      • 亚马尔
      • myawsservice/
        • app.py
      • 测试/
        • test_event.json
我在python3.6虚拟环境中工作,并使用安装工具安装了python包(mymodulename):

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吗?我面临着同样的问题