#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
к своей функции следующее:
- Создайте пустую папку, например
mylayer
. - Перейдите в папку и создайте
requirements.txt
файл с содержимым
psycopg2-binary
- Выполните следующую команду 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"
- Заархивируйте слой как zip:
zip -9 -r mylayer.zip python
- Создайте лямбда-слой на основе
mylayer.zip
в консоли AWS. Не забудьте указатьCompatible runtime
python3.8
. - Добавьте слой, созданный на шаге 5, в свою функцию.
- Я протестировал слой, используя ваш код:
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. Большое вам спасибо. Наконец-то я запустил это.