Python не находит модуль при выполнении локального вызова AWS sam - PullRequest
1 голос
/ 02 мая 2019

Я только что начал использовать AWS без сервера с использованием SAM и столкнулся с проблемой ниже:

При вызове SAM не удается найти модуль python, который импортирует мой лямбда-обработчик, но в противном случае я могу импортировать этот модуль,

Структура моего проекта:

root-dir /

  • mymodulename /
    • mymodule.py
  • aws /
    • sam /
      • template.yaml
      • упакованы.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

, я получаю сообщение error :

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, needs.txt и template.yaml в корневой каталог и выполнение:

sam build

Это будет хранить сторонние зависимости и мой собственный модуль python, и template.py теперь сможет найти его во время локального вызова sam.

Это, однако, непрактично для больших проектов, и я думаю, что на данный момент ответ может быть что-то вроде this .Хотя это для serverless.yaml.Я не уверен, что SAM поддерживает этот синтаксис.Не догадываясь

...