Я пытаюсь развернуть лямбда-функцию 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?
serverless пытается установить требования из
Serverless: Installing requirements from
/Users/Desktop/postgresql/.serverless/requirements/requirements.txt
Я бы посоветовал следующее
virtualenv ./envsource env/bin/activatepip install psycopg2pip 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
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>