Как решить «Время выполнения.ImportModuleError» Нет модуля с именем ‘mysql’ в AWS lambda?

#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:

Таким образом, для этого вопроса я проверил его следующим образом:

  1. Создайте пустую папку, например mylayer .

  2. Перейдите в папку и создайте requirements.txt файл с содержимым

 boto3==1.14.49
mock==4.0.2
moto==1.3.14
mysql-connector-python==8.0.21
  
  1. Запустите следующую команду 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"
  
  1. Создайте слой как zip:
 zip -r -9 mylayer.zip python 
  
  1. Создайте лямбда-слой на основе mylayer.zip в консоли AWS.
    Не забудьте указать Compatible runtimes to python3.8 . Слой будет
    в целом, около 48 МБ. Таким образом, было бы неплохо проверить, есть ли у вас
    действительно нужны все эти пакеты.

  2. Протестируйте слой в lambda, используя следующую функцию lambda:

 import mysql

def lambda_handler(event, context):
    
    print(dir(mysql))
  

Функция выполняется правильно:

 ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__']