Как мне развернуть функцию на Python с ее зависимостями?

Я пытаюсь использовать serverless фреймворк для создания и развертывания функции AWS Lambda. Я создал папку с именем vendored в корне проекта и установил (используя pip install) зависимости функций. Однако всякий раз, когда я пытаюсь запустить его (используя serverless function run), я получаю сообщение об ошибке:

Бессерверный: запущен isNewUser ...
Бессерверный: ПРЕДУПРЕЖДЕНИЕ: эта переменная не определена: регион
Бессерверный: -----------------
Бессерверный: сбой - Эта ошибка была возвращена:
Без сервера: {"исключение": ["Отслеживание (последний вызов последним): \ n", "Файл \" / home / fernando / .nvm / versions / node / v5.10.1 / bin / serverless-run-python-handler \ ", строка 170, в \ n handler = import_program_as_module (путь) \ n", "Файл \" / home / fernando / .nvm / versions / node / v5.10.1 / bin / serverless -run-python-handler \ ", строка 149, в import_program_as_module \ n module = make_module_from_file ('lambda_handler', handler_file) \ n", "File \" / home / fernando / .nvm / versions / node / v5.10.1 / bin / serverless-run-python-handler \ ", строка 129, в make_module_from_file \ n py_source_description \ n", "File \" / home / fernando / workspace / os-cac / isNewUser / handler.py \ ", строка 11, in \ n из vtex.order import Order \ n "," ImportError: нет модуля с именем vtex.order \ n "]," success ": false} Serverless: сообщение об исключении из Python
Serv erless: Traceback (последний вызов последним):, File "/home/fernando/.nvm/versions/node/v5.10.1/bin/serverless-run-python-handler", строка 170, в handler = import_program_as_module (path) , Файл "/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), File "/ home /fernando/.nvm/versions/node/v5.10.1/bin/serverless-run-python-handler ", строка 129, в make_module_from_file py_source_description, File" /home/fernando/workspace/os-cac/isNewUser/handler.py ", строка 11, in from vtex.order import Order, ImportError: Нет модуля с именем 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

Я что-то делаю не так? Должен ли я каким-то образом настроить свою функцию, чтобы включить зависимости от поставщиков?


person Fernando Pereira    schedule 29.04.2016    source источник


Ответы (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
    

Вот и все. Сообщите мне, сработало ли это.

person Benny Bauer    schedule 29.04.2016
comment
Имейте в виду, что библиотеки, которые вы поставляете в бессерверный пакет, могут не работать в среде AWS Lambda. Обычно это верно только для библиотек, отличных от чистого Python, таких как криптография, cffi и другие. Если вы столкнетесь с этим, вы можете выбрать библиотеки с ресурса, например github.com/Miserlou/lambda- пакеты, или вы можете выполнить установку пакетов на машине Linux, которая достаточно близка к Amazon Linux (я использовал centos 6-x64), и скопировать из каталога site-packages, который заполняется. Если кому-то нужна дополнительная информация, ответьте здесь, и я добавлю вопрос и ответ. - person Chris Johnson; 12.10.2016
comment
Спасибо, это работает для меня. Но существует ли способ, совместимый с PEP 8, для достижения тех же результатов? - person WhiteHotLoveTiger; 26.03.2018

Я бы рекомендовал использовать подключаемый модуль serverless-python-requirements для включения пакетов, установленных через pip

person maafk    schedule 01.09.2017
comment
За исключением того, что он взрывается при попадании в setup.py проекта, загруженного через github. Не смешно. См. github.com/serverless/serverless/issues/6495# - person Samantha Atkins; 03.08.2019

Я выполнил следующие шаги для развертывания с зависимостями:

  • Создан каталог для зависимостей в корне проекта mkdir .vendor

  • Добавьте зависимости в файл requirements.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 загрузит функцию с зависимостями.

person Rajesh Hegde    schedule 13.01.2017
comment
Ух ты. sys path munging заставляет меня чувствовать себя грязным. Конечно, есть способ получше. - person Samantha Atkins; 03.08.2019