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