Как мне развернуть функцию в 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 ответа

Решение

Вот несколько шагов, которые должны заставить его работать:

  1. Убедитесь, что запись обработчика в s-function.json имеет имя функции в своем пути:"handler": "function-name/handler.handler",
  2. в 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 загрузит функцию с зависимостями.

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