运行 AWS sam local invoke 时 Python 未找到模块

Wil*_*man 11 python-3.x aws-lambda aws-serverless

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

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

结构我的项目是:

根目录/

  • 我的模块名称/
    • 我的模块.py
  • aws/
    • 山姆/
      • 模板.yaml
      • 打包的.yaml
      • myawsservice/
        • 应用程序
      • 测试/
        • 测试事件.json

我在 python3.6 虚拟环境中工作,我已经使用安装工具安装了我的 python 包(mymodulename):

python setup.py develop
Run Code Online (Sandbox Code Playgroud)

因此,如果我在虚拟环境中冻结 pip,我会看到:

Pillow==6.0.0
PyPDF2==1.26.0
reportlab==3.5.20
mymodulename==0.5.0
Run Code Online (Sandbox Code Playgroud)

另外如果我去:

cd root-dir/aws/sam/
python

>>> import mymodulename
Run Code Online (Sandbox Code Playgroud)

这成功了。所以它在python路径上。

但是当我在本地调用 sam 时,即:

sam local invoke MyAWSServiceFunction --event ../sam/test/test_event.json
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:

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'"}
Run Code Online (Sandbox Code Playgroud)

这是我的app.py的代码:

from mymodulename.mymodule import mymodulefunction

def lambda_handler(event, context):    
    return mymodulefunction(event['body'])
Run Code Online (Sandbox Code Playgroud)

我可以从我的单元测试中运行上面的代码,而不是从 sam invoke 环境中运行。

模板.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
Run Code Online (Sandbox Code Playgroud)

帮助表示赞赏。

编辑

一种解决方法是将 app.py、requirements.txt 和 template.yaml 放在根目录中并执行:

sam build
Run Code Online (Sandbox Code Playgroud)

这会将第 3 方依赖项和我自己的 python 模块存储在一起,并且 template.py 现在可以在 sam 本地调用期间找到它。

然而,这对于更大的项目并不实用,我想现在的答案可能是这样的。虽然这是针对 serverless.yaml 的。我不确定 SAM 是否支持这种语法。猜测没有。

Iri*_*lho 6

自从这个问题被提出以来已经很长时间了,但它可能对某人有帮助。我是如何修复它的:

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

-e对本地代码的引用,此链接可能有帮助。