Я только что начал использовать AWS без сервера с использованием SAM и столкнулся с проблемой ниже:
При вызове SAM не удается найти модуль python, который импортирует мой лямбда-обработчик, но в противном случае я могу импортировать этот модуль,
Структура моего проекта:
root-dir /
- mymodulename /
- aws /
- sam /
- template.yaml
- упакованы.yaml
- myawsservice /
- test /
Я работаю в виртуальной среде 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 поддерживает этот синтаксис.Не догадываясь