3

Я пытаюсь внедрить сельдерей с django и эластичным бобовым стеблем с SQS, но я до сих пор не знаю, как мне начинать работать в фоновом режиме, кажется, что мне нужно создать AMI вне EB. Я даже по правильному пути? Есть ли лучший способ иметь параллельные задачи?Каков наилучший способ реализации параллельных задач с помощью Django и Elastic beanstalk?

ответ

2

Обновление: Я нашел альтернативное решение для этого, которое проще и стабильнее. См. Мой ответ в этом вопросе: How do you run a worker with AWS Elastic Beanstalk?

Мне просто нужно было понять это для проекта, над которым я работаю. Потребовалось некоторое возиться, но в итоге решение довольно просто реализовать. Вы можете добавить три файла «динамически» на сервер, используя директиву files: в крючке ebextension. Эти три файла:

  1. Скрипт, который запускает daeomon (находится в /etc/init.d/)
  2. Файл конфигурации, настройка демона исходного скрипта, который находится в/и т.д./по умолчанию/
  3. скрипта, который копирует окр вары из приложения в среду celeryd и запускает службу (развертывание поста)

сценарий запуска может быть по умолчанию из хранилища, так что непосредственно от GitHub.

Конфигурация должна быть адаптирована к вашему проекту. Вам нужно добавить собственное имя приложения в настройку CELERY_APP, и вы можете передать дополнительные аргументы работнику с помощью параметра CELERYD_OPTS (например, значение параллелизма может быть установлено там).

Затем вам также необходимо передать переменные среды для вашего проекта демон работника, так как ему нужны те же переменные среды, что и основное приложение. Примером могут служить секретные ключи AWS, которые работник сельдерея должен иметь, чтобы иметь возможность подключиться к SQS и, возможно, S3. Вы можете сделать это, просто добавляя окр вары из текущего приложения в файл конфигурации:

cat /opt/python/current/env | tee -a /etc/default/celeryd 

Наконец сельдерей работник должен быть запущен. Этот шаг должен произойти после того, как база кода была развернута на сервере, поэтому необходимо активировать развертывание «пост». Вы можете сделать это, используя недокументированные post-deploy hooks. Любой файл оболочки в /opt/elasticbeanstalk/hooks/appdeploy/post/ будет выполняться путем развертывания после установки эластичной оболочки. Таким образом, вы можете добавить команду service celeryd restart в файл сценария в этой папке. Для удобства я поместил как копирование переменных среды, так и команду start в один файл.

Обратите внимание, что вы не можете использовать директиву services: непосредственно для запуска демона, так как это попытается запустить работника celeryd перед развертыванием базы кода на сервере, чтобы это не сработало (отсюда развертывание «post» скрипт).

Хорошо, все это вместе, единственное, что нужно, чтобы создать файл ./ebextensions/celery.config в основной директории вашего кодовый со следующим содержанием (принято на ваш кодовый конечно):

files: 
    "/etc/init.d/celeryd": 
    mode: "000755" 
    owner: root 
    group: root 
    source: https://raw2.github.com/celery/celery/22ae169f570f77ae70eab03346f3d25236a62cf5/extra/generic-init.d/celeryd 

    "/etc/default/celeryd": 
    mode: "000755" 
    owner: root 
    group: root 
    content: | 
     CELERYD_NODES="worker1" 
     CELERY_BIN="/opt/python/run/venv/bin/celery" 
     CELERY_APP="yourappname" 
     CELERYD_CHDIR="/opt/python/current/app" 
     CELERYD_OPTS="--time-limit=30000" 
     CELERYD_LOG_FILE="/var/log/celery/%N.log" 
     CELERYD_PID_FILE="/var/run/celery/%N.pid" 
     CELERYD_USER="ec2-user" 
     CELERYD_GROUP="ec2-user" 
     CELERY_CREATE_DIRS=1 

    "/opt/elasticbeanstalk/hooks/appdeploy/post/myapp_restart_celeryd.sh": 
    mode: "000755" 
    owner: root 
    group: root 
    content: | 
     #!/usr/bin/env bash 
     # Copy env vars to celeryd and restart service 
     su -c "cat /opt/python/current/env | tee -a /etc/default/celeryd" $EB_CONFIG_APP_USER 
     su -c "service celeryd restart" $EB_CONFIG_APP_USER 

services: 
    sysvinit: 
    celeryd: 
     enabled: true 
     ensureRunning: false 

Надеется, что это помогает.