运行AWS SAM本地调用时Python未找到模块

时间:2019-05-02 08:43:33

标签: python-3.x aws-lambda aws-serverless

我刚刚开始使用SAM使用无服务器AWS并遇到以下问题:

SAM调用似乎找不到我的lambda处理程序正在导入的python模块,但是我可以否则导入该模块。

我项目的结构是:

root-dir /

  • mymodulename /
    • mymodule.py
  • aws /
    • sam /
      • template.yaml
      • packaged.yaml
      • myawsservice /
        • app.py
      • test /
        • test_event.json

我正在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是否支持此语法。猜不出来

1 个答案:

答案 0 :(得分:1)

这个问题提出以来已经有很长时间了,但这可能对某人有所帮助。我如何解决它:

  • 将您的代码从mymodulename/移至mymodulename/mymodulename/__init__.py
  • mymodulename中创建一个setup.py,他将负责创建一个名为mymodulename的程序包
  • 在您的lambda函数的requirements.txt中添加以下内容:-e mymodulename/

-e引用了您的本地代码,这个link可能也有帮助。