папка psycopg2 заархивирована в функцию python venv lambda

#python #amazon-web-services #psycopg2

#python #amazon-веб-сервисы #psycopg2

Вопрос:

Я пытаюсь добавить пакеты для psycopg2 в мою архивированную папку для моей функции python lambda. Я использую Python версии 3.8. Вот документация psycopg2 psycopg2.

Из этих документов кажется, что мне нужно извлечь папку для psycopg2-3.8 в архивированный файл для моей лямбда-функции. Однако, похоже, я не могу добиться успешного запуска.

Я использую виртуальную среду и создаю zip-файл в соответствии с этими документами AWS для виртуальной среды

Чтобы заархивировать папку psycopg, я запускаю zip -g my-deployment-package.zip psycopg2

Ошибка, которую я получаю,

 {
  "errorMessage": "Unable to import module 'test': No module named 'psycopg2._psycopg'",
  "errorType": "Runtime.ImportModuleError"
}
 

Любая помощь в устранении неполадок была бы отличной.

Комментарии:

1. Рассматривали ли вы возможность использования layer with psycopg2-binary ? Ее гораздо проще настроить, поскольку вам не нужно компилировать и беспокоиться о зависимостях уровня C.

2. Я этого раньше не видел. Как она используется?

Ответ №1:

psycopg2-binary — это двоичный пакет pip psycopg2 , который поставляется со всеми зависимостями и не требует компиляции. Чтобы использовать ее в своей лямбда-функции, вы можете создать лямбда-слой с помощью docker, как описано в блоге AWS .

Таким образом, вы можете добавить psycopg2-binary к своей функции следующее:

  1. Создайте пустую папку, например mylayer .
  2. Перейдите в папку и создайте requirements.txt файл с содержимым
 psycopg2-binary
 
  1. Выполните следующую команду docker:

Команда создаст слой для python3.8:

 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 -9 -r mylayer.zip python 
 
  1. Создайте лямбда-слой на основе mylayer.zip в консоли AWS. Не забудьте указать Compatible runtime python3.8 .
  2. Добавьте слой, созданный на шаге 5, в свою функцию.
  3. Я протестировал слой, используя ваш код:
 import psycopg2

def lambda_handler(event, context):
    
    print(dir(psycopg2))
    
    return "ok"
 

Он работает правильно:

 ['BINARY', 'Binary', 'DATETIME', 'DataError', 'DatabaseError', 'Date', 'DateFromTicks', 'Error', 'IntegrityError', 'InterfaceError', 'InternalError', 'NUMBER', 'NotSupportedError', 'OperationalError', 'ProgrammingError', 'ROWID', 'STRING', 'Time', 'TimeFromTicks', 'Timestamp', 'TimestampFromTicks', 'Warning', '__builtins__', '__cached__', '__doc__', '__file__', '__libpq_version__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_connect', '_ext', '_json', '_psycopg', '_range', 'apilevel', 'compat', 'connect', 'errors', 'extensions', 'paramstyle', 'threadsafety', 'tz']
 

p.s.

Шаги выполнялись в Linux. Если у вас ее нет, вы можете создать экземпляр linux ec2 и настроить docker там, если вы не уверены, как изменить команды для Windows или Mac.

Комментарии:

1. Нужно ли мне устанавливать docker в моем проекте, чтобы это работало?

2. @tdammon Установка docker зависит от вашей операционной системы. Если вы не уверены, как это сделать, возможно, пришло время учиться. Использование docker для создания лямбда-слоев является наиболее надежным способом добавления различных зависимостей к вашей функции. Итак, как только вы научитесь делать это один раз, создание слоев для 90% других возможных пакетов python в ваших будущих проектах будет простым.

3. Я работаю над изучением процесса. На шаге 4 я столкнулся с некоторыми проблемами. Я получаю сообщение об ошибке zip warning: name not matched: python . Я не уверен, связано ли это с тем, что я нахожусь на Mac или нет.

4. Я думаю, что я понял ошибку, которую я перечислил выше. Моя lib папка находится внутри venv папки. Даже когда я обновляю это, я получаю сообщение об ошибке ` Это похоже на путь. Файл ‘echo psycopg2-binary > ./requirements.txt «не существует`.. Мне кажется, это указывает на то, что в моей файловой структуре есть ошибка. Где в моем каталоге проекта я должен создать папку mylayer?

5. Большое вам спасибо. Наконец-то я запустил это.