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

Я пытаюсь развернуть лямбда-функцию Python, используя без сервера. Мне нужна библиотека psycopg2, поэтому я использовал плагин serverless-python-needs и добавил его в свой файл 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 "".

Структура моего почтового файла:

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

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

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

8 ответов

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

      # serverless.yaml
custom:
    pythonRequirements:
        dockerizePip: true

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

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

 pip freeze > requirements.txt

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

безсерверный пытается установить требования от 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 Flask на AWS и при его настройке получил ту же ошибку. Я решил это, выполнив следующие действия:

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

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

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

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

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

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

плагины: - serverless-wsgi - serverless-python-requirements

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

Вы можете заметить, что 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 в облаке, и вы не получите ошибку, когда модуль недоступен.

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

  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 

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

и укажите его в serverless.ymlname: [имя вашего бессерверного проекта] Layers: - [arn-of aws Layers package]

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

Я также запускаю Lambdas в AWS, для которых требуется psycopg2, и также столкнулся с проблемами развертывания. Решение состоит в том, чтобы использовать aws-psycopg2 и включить его в файл requirements.txt.

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

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

try:
 import unzip_requirements
except ImportError:
 pass

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

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