Бессерверное развертывание с serverless-python-требованиями не работает

Я пытаюсь развернуть лямбда-функцию Python без использования сервера. Мне нужна библиотека psycopg2, поэтому я использовал плагин serverless-python-requirements и добавил его в свой файл serverless.yml.

plugins:
  - serverless-python-requirements
custom:
    pythonRequirements:
        dockerizePip: non-linux

Я могу успешно развернуть функцию:

Serverless: Installing requirements from 
/Users/Desktop/postgresql/.serverless/requirements/requirements.txt ...
Serverless: Docker Image: lambci/lambda:build-python3.6
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Injecting required Python packages to package...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (43.07 MB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...

..............
Serverless: Stack update finished...

Но когда я проверяю свои журналы Cloudwatch, он говорит, что «Нет модуля с именем 'psycopg2'».

Структура моего zip-файла:

    |--node_modules
    |--.gitignore
    |--handler.py
    |--package-lock.json
    |--package.json
    |--serverless.yml

Когда я запускал бессерверное развертывание, не было создано .serverless / dir ...

Любая помощь будет принята с благодарностью!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
5 409
7

Ответы 7

Правильно ли вы установили зависимости Python?

serverless пытается установить требования из Serverless: Installing requirements from /Users/Desktop/postgresql/.serverless/requirements/requirements.txt

Я бы посоветовал следующее

  • создать virtualenv virtualenv ./env
  • активировать это source env/bin/activate
  • установите свои депенденции pip install psycopg2
  • заморозить ваши локальные зависимости pip freeze > requirements.txt

Предполагая, что ваш код импортирует вашу зависимость, разверните без сервера.

Вам нужно только определить ваши зависимости Python в файле requirements.txt. Вы можете сделать это вручную или использовать pip freeze с:

 pip freeze > requirements.txt

Немного поздно, но для тех, кто сталкивается с подобной проблемой.

Вы развертываете свои требования в виде zip-архива. Вы должны распаковать требования, прежде чем импортировать их в свой скрипт python. Добавьте эту строку кода поверх вашего скрипта python, в который вы хотите импортировать библиотеки:

try:
 import unzip_requirements
except ImportError:
 pass

При желании вы можете выдать ошибку при исключении или просто пройти.

Я развернул приложение Python Flask на AWS и при его настройке получил ту же ошибку. Я решил это, выполнив следующие действия:

Я надеюсь, что вы используете виртуальную среду, в которую вы установили все необходимые библиотеки Python. Я не видел файлов виртуальной среды в вашем списке папок. Вы можете проверить файл readme моего репозитория git, чтобы узнать, как создавать с нуля. Я задокументировал все свои шаги - https://github.com/shyam454/Flask_AWS

Примечание. Репо работает, но я все еще разрабатываю его, поэтому конечные точки, упомянутые в Readme, еще не включены в код. Но это все еще хорошо в отношении настройки Python + Flask.

Если у вас уже есть виртуальная среда, выполните следующие действия:

Перед развертыванием без использования сервера выполните pip freeze> requirements.txt

Эта команда будет включать все библиотеки python, которые вы установили в своей виртуальной среде, которые будут присутствовать в файле requirements.txt.

В файле serverless.yml добавьте эти строки

плагины: - бессерверный WSGI - serverless-python-требования

А теперь сделайте бессерверное развертывание

Вы можете заметить, что serverless установит все требования из файла requirements.txt. вы должны увидеть следующие строки во время бессерверного развертывания,

Бессерверный: требования созданы из xxxxxx \ AWS \ Flask_AWS \ requirements.txt в xxxxxx \ AWS \ Flask_AWS.serverless \ requirements.txt ...

Бессерверная: установка требований из xxxxxxx \ AWS \ Flask_AWS.serverless \ requirements \ requirements.txt ...

Это когда он устанавливает библиотеки python в облаке, и вы не получите ошибку, когда модуль недоступен.

Я надеюсь, это поможет вам.

Я предлагаю вам использовать лямбда-слой AWS. Загрузите вручную рабочие пакеты psycopg2 в слой лямбда aws.

и ссылайтесь на него на serverless.yml name: [название вашего бессерверного проекта] слои: - [пакет слоев arn-of aws]

Примечание: слои находятся на одном уровне имени в serverless.yml

  1. сначала создайте виртуальную среду Python, затем активируйте или используйте глобальную среду
  2. установите node js и установите пакет serverless-offline (ниже используйте команду)
npm install -g serverless-offline

файл serverless.yaml

service: XXXX #Name of your App

plugins:
  - serverless-offline

package:
  individually: true
  patterns:
    - '!./**'

затем запустите команду ниже (если вы используете терминал vscode, тогда должен быть доступ администратора к терминалу или лучше использовать или терминал ОС)

serverless -offline

если вы хотите развернуть вживую, создайте слой лямбда

и используйте ARN уровня лямбда в бессерверном файле yaml, например

functions:
  prodAddFeatures:
    name: prodAddFeatures
    handler: addfeatures/lambda_function.lambda_handler
    events:
      - http:
          path: /about/addfeatures
          method: post
          cors: true
          
    layers:
      - arn:aws:lambda:us-XXXX-1:XXXXXXX:layer:final:3
    package:
      individually: true
      patterns:
        - './addfeatures/lambda_function.py'

тогда используйте

serverless deploy 

Плагин serverless-python-requirements использует кеш. Обязательно очистите его перед тем, как упаковать услугу. Кроме того, psycopg требует компиляции с лямбда-окружением:

# serverless.yaml
custom:
    pythonRequirements:
        dockerizePip: true

# bash
$ serverless requirements cleanCache
$ serverless deploy --stage <stage>

Другие вопросы по теме