Как мне развернуть функцию в python с ее зависимостями?
Я пытаюсь использовать serverless
фреймворк для создания и развертывания функции AWS Lambda. Я создал папку с именем vendored
в корне проекта и установлен (используя pip install
) зависимости функции. Однако всякий раз, когда я пытаюсь запустить его (используя serverless function run
) Я получил ошибку:
Без сервера: Запуск isNewUser...
Без сервера: ПРЕДУПРЕЖДЕНИЕ: эта переменная не определена: регион
Без сервера: -----------------
Serverless: Failed - эта ошибка была возвращена:
Без сервера: {"исключение": ["Трассировка (последний последний вызов):\n", "Файл \"/home/fernando/.nvm/version /node/v5.10.1/bin/serverless-run-python-handler\", строка 170, в \ n обработчик = import_program_as_module(путь)\n", "Файл \" / home / fernando /.nvm / версии / узел / v5.10.1 / bin / serverless-run-python-handler \ ", строка 149, в файле import_program_as_module\n module = make_module_from_file('lambda_handler', handler_file)\n", " Файл \ "/ home / fernando /.nvm / версии / узел / v5.10.1 / bin / serverless-run-python- обработчик \ ", строка 129, в файле make_module_from_file\n py_source_description\n", "Файл \" / home / fernando / рабочая область /os-cac/isNewUser/handler.py\", строка 11, в \ n из импорта vtex.order Order\n", "ImportError: нет модуля с именем vtex.order\n"], "success": false} Без сервера: сообщение об исключении из Python
Без сервера: трассировка (последний вызов был последним):, файл "/home/fernando/.nvm/versions/node/v5.10.1/bin/serverless-run-python-handler", строка 170, в обработчике = import_program_as_module(путь), Файл "/home/fernando/.nvm/versions/node/v5.10.1/bin/serverless-run-python-handler", строка 149, в файле import_program_as_module module = make_module_from_file('lambda_handler', handler_file), Файл "/ home /fernando/.nvm/versions/node/v5.10.1/bin/serverless-run-python-handler ", строка 129, в файле make_module_from_file py_source_description, файл"/home/fernando/workspace/os-cac/isNewUser/handler.py", строка 11, из порядка импорта vtex.order, ошибка импорта: нет модуля с именем vtex.order `
vtex.order
это модуль, импортированный в handler.py
Структура моего проекта примерно такая:
/root/
|
|--_meta/
|--vendored/
|--dependencies...
|--function-name/
|--handler.py
|--event.json
|--s-function.json
|--requirements.txt
|--admin.env
|--package.json
|--s-project.json
|--s-resources-cf.json
|--s-project.json
Что-то я делаю не так? Должен ли я как-то настроить свою функцию, чтобы включить зависимости от вендора?
3 ответа
Вот несколько шагов, которые должны заставить его работать:
- Убедитесь, что запись обработчика в
s-function.json
имеет имя функции в своем пути:"handler": "function-name/handler.handler",
в
handler.py
добавить следующее:import os import sys here = os.path.dirname(os.path.realpath(__file__)) sys.path.append(os.path.join(here, "../vendored")) from vtex.order import Order
Вот и все. Дайте мне знать, если это сработало.
Я бы порекомендовал использовать плагин serverless-python- needs для включения пакетов, установленных через pip
Я выполнил следующие шаги для развертывания с зависимостями:
Создан каталог для зависимостей в корне проекта
mkdir .vendor
Добавьте зависимости в файл needs.txt вручную или используйте
pip freeze > requirements.txt
Обновить файл serverless.yml
package:
include:
- .vendor/**
- Включите каталог.vendor в системный путь в файле handler.py
import sys
sys.path.insert(0, './.vendor')
- Установить зависимости
pip install -r requirements.txt -t .vendor
Сейчас serverless deploy
загрузит функцию с зависимостями.