#python #amazon-web-services #aws-lambda #dependencies
#python #amazon-веб-сервисы #aws-lambda #зависимости
Вопрос:
Я тестирую скрипт Python в Lambda, он выдал мне ошибку:
{
"errorMessage": "Unable to import module 'pythonfilename': No module named 'mysql'",
"errorType": "Runtime.ImportModuleError"
}
Как я могу это исправить? Когда я тестировал скрипт локально, я получил ту же ошибку, но после того, как я обновился pip
до 20.2.2, pip install mysql-connector
эта ошибка была устранена локально, как я могу решить эту проблему в Lambda env? Спасибо.
Ответ №1:
Если вы развертываете функцию в AWS lambda, вам необходимо объединить свои зависимости:https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies
Ответ №2:
Вы можете создать пользовательский слой Lambda с вашими пакетами.
Чтобы проверить это решение, я создал такой слой и могу подтвердить, что он работает.
Используемый метод включает в себя инструмент docker, описанный в недавнем блоге AWS:
Таким образом, для этого вопроса я проверил его следующим образом:
-
Создайте пустую папку, например
mylayer
. -
Перейдите в папку и создайте
requirements.txt
файл с содержимым
boto3==1.14.49
mock==4.0.2
moto==1.3.14
mysql-connector-python==8.0.21
- Запустите следующую команду docker:
docker run -v "$PWD":/var/task "lambci/lambda:build-python3.8" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.8/site-packages/; exit"
- Создайте слой как zip:
zip -r -9 mylayer.zip python
-
Создайте лямбда-слой на основе
mylayer.zip
в консоли AWS.
Не забудьте указатьCompatible runtimes
topython3.8
. Слой будет
в целом, около 48 МБ. Таким образом, было бы неплохо проверить, есть ли у вас
действительно нужны все эти пакеты. -
Протестируйте слой в lambda, используя следующую функцию lambda:
import mysql
def lambda_handler(event, context):
print(dir(mysql))
Функция выполняется правильно:
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']