Conda для AWS Lambda
Я хотел бы настроить функцию Python, написанную на AWS Lambda, функцию, которая зависит от группы библиотек Python, которую я уже собрал в среда conda.
Чтобы настроить это на Lambda, я должен закрепить эту среду, но Lambda docs дает только инструкции о том, как это сделать это использование pip/VirtualEnv. Кто-нибудь имеет опыт с этим?
Ответы
Ответ 1
Вы должны использовать serverless framework в сочетании с serverless плагин -python-requirements. Вам просто нужен requirements.txt
, и плагин автоматически упаковывает ваш код и зависимости в zip файл, загружает все на s3 и развертывает вашу функцию. Бонус: поскольку он может выполнять эту операцию, он также может помочь вам с пакетами, которые нуждаются в бинарных зависимостях.
Посмотрите здесь (https://serverless.com/blog/serverless-python-packaging/) для справки.
Из опыта я настоятельно рекомендую вам изучить это. Каждый бит ручной работы для развертывания и т.д. - это то, что мешает вам развивать вашу логику.
Изменить 2017-12-17:
Ваш комментарий имеет смысл @eelco-hoogendoorn.
Однако, на мой взгляд, среда conda - это просто инкапсулированное место, где живет куча пакетов python. Итак, если вы поместите все эти зависимости (от вашего conda env) в requirements.txt
(и используйте сервер без сервера +), который поможет решить вашу проблему, нет?
IMHO, по сути, будет таким же, как застежка всех пакетов, которые вы установили в своем env, в свой пакет развертывания. При этом здесь есть фрагмент, который делает это по существу:
conda env export --name Name_of_your_Conda_env | yq -r '.dependencies[] | .. | select(type == "string")' | sed -E "s/(^[^=]*)(=+)([0-9.]+)(=.*|$)/\1==\3/" > requirements.txt
К сожалению conda env export
экспортирует только среду в формате yaml. Флаг --json
не работает прямо сейчас, но предполагается, что он будет исправлен в следующей версии. Вот почему мне пришлось использовать yq вместо jq. Вы можете установить yq
с помощью pip install yq
. Это всего лишь обертка вокруг jq
, чтобы позволить ей работать с файлами yaml.
ХРАНИТЬ В РАЗНООБРАЗИИ
Код развертывания Lambda может быть только размером 50 МБ. Ваша среда не должна быть слишком большой.
Я не пробовал использовать lambda с serverless
+ serverless-python-packaging
и requirements.txt
, созданный таким образом, и я не знаю, будет ли это работать.
Ответ 2
Я не могу придумать вескую причину, по которой не удалось закрепить среду вашей конды.
Я хочу, чтобы вы вошли в каталог anaconda2/envs/
или anaconda3/envs/
и скопировали /zip каталог env, который вы хотите загрузить. Конда - это просто версия виртуального виртуального пользователя, плюс другой и несколько необязательный пакет-менеджер. Основная причина, по которой я думаю, это нормально, так это то, что среды конды инкапсулируют все свои зависимости в своих конкретных каталогах .../anaconda[2|3]/envs/$VIRTUAL_ENV_DIR/
по умолчанию.
Использование нормального выражения virtualenv дает вам немного больше свободы, подобно тому, как у пещерных людей была больше свободы, чем у современных людей. Лично я предпочитаю автомобили. С virtualenv вы в основном получаете полупустую переменную $PYTHON_PATH
, которую вы можете заполнить тем, что хотите, а не более надежный, предварительно заполненный env, который вырывает Conda. Ниже приведена справочная таблица: https://conda.io/docs/commands.html#conda-vs-pip-vs-virtualenv-commands
Конда превращает команду ~$ /path/to/$VIRTUAL_ENV_ROOT_DIR/bin/activate
в ~$ source activate $VIRTUAL_ENV_NAME
Скажите, что вы хотите сделать virtualenv
старомодным способом. Вы бы выбрали каталог (позвоните ему $VIRTUAL_ENV_ROOT_DIR
,) и имя (которое мы назовем $VIRTUAL_ENV_NAME
.) На этом этапе вы должны ввести:
~$ cd $VIRTUAL_ENV_ROOT_DIR && virtualenv $VIRTUAL_ENV_NAME
python затем создает копию собственной библиотеки интерпретатора (плюс pip и setuptools, я думаю) и помещает исполняемый файл под названием activate
в этот каталог clone bin/
. $VIRTUAL_ENV_ROOT_DIR/bin/activate
script работает, изменяя текущую переменную среды $PYTHONPATH
, которая определяет, какой интерпретатор python вызывается при вводе ~$ python
в оболочку, а также список каталогов, содержащих все модули, которые интерпретатор увидит, когда сказано import
что-то. Это основная причина, по которой вы увидите #!/usr/bin/env python
в коде людей вместо /usr/bin/python
.
Ответ 3
Основная причина, по которой я использую conda
, - это вариант не для компиляции разных бинарных пакетов (например, numpy
, matplotlib
, pyqt
и т.д.), или их компиляции реже. Когда вам нужно что-то скомпилировать для конкретной версии python
(например, uwsgi
), вы должны скомпилировать двоичные файлы с той же версией gcc
, что python
в вашей среде conda
скомпилирован с - скорее всего, это не та самая gcc
, которую использует ваша ОС, поскольку conda
теперь использует последние версии gcc
, которые должны быть установлены с помощью conda install gxx_linux-64
.
Это приводит нас к двум ситуациям:
Это общий ответ на ваш вопрос, но основная идея заключается в том, что вы не можете повторно использовать свои двоичные пакеты, а только их список.