Как вы работаете с AWS Elastic Beanstalk?

Я запускаю приложение django на эластичном бобовом стебле aws. Я хотел бы запустить фоновое задание или рабочий, чтобы запустить сельдерей.

Я не могу найти, если это возможно или нет. Если да, то как это может быть достигнуто.

Вот что я делаю сейчас, но каждый раз выдает ошибку типа события.

container_commands:
  01_syncdb:
    command: "django-admin.py syncdb --noinput"
    leader_only: true
  50_sqs_email:
    command: "./manage.py celery worker --loglevel=info"
    leader_only: true

Спасибо за помощь,

2 ответа

Как @chris-wheadon предложил в своем комментарии, вы должны попытаться запустить сельдерей в качестве демона на заднем плане. AWS Elastic Beanstalk уже использует http://supervisord.org/ для запуска некоторых процессов deamon. Таким образом, вы можете использовать это для запуска celeryd и избежать создания собственного AMI для этого. Это хорошо работает для меня.

Что я делаю, так это программно добавляю конфигурационный файл celeryd к экземпляру после того, как приложение развернуто в нем EB. Сложность в том, что в файле должны быть установлены необходимые переменные окружения для демона (например, ключи доступа AWS, если вы используете S3 или другие сервисы в своем приложении).

Ниже приведена копия скрипта, который я использую, добавьте этот скрипт в свой .ebextensions папка, которая настраивает вашу среду EB.

Сценарий установки создает файл в недокументированном /opt/elasticbeanstalk/hooks/appdeploy/post/ папка, которая живет на всех экземплярах EB. Любой сценарий оболочки будет выполнен после развертывания. Размещенный там сценарий оболочки работает следующим образом:

  1. в celeryenv переменная, окружающая среда virutalenv хранится в формате, который соответствует записи супервизора. Это список переменных env, разделенных запятыми.
  2. Затем скрипт создает переменную celeryconf который содержит файл конфигурации в виде строки, которая включает ранее проанализированные переменные env.
  3. Затем эта переменная передается в файл с именем celeryd.conf, файл конфигурации супервизора для демона сельдерея.
  4. Наконец, путь к вновь созданному файлу конфигурации добавляется к основному supervisord.conf файл, если его там еще нет.

Вот копия сценария:

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_celeryd.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash

      # Get django environment variables
      celeryenv=`cat /opt/python/current/env | tr '\n' ',' | sed 's/export //g' | sed 's/$PATH/%(ENV_PATH)s/g' | sed 's/$PYTHONPATH//g' | sed 's/$LD_LIBRARY_PATH//g'`
      celeryenv=${celeryenv%?}

      # Create celery configuraiton script
      celeryconf="[program:celeryd]
      ; Set full path to celery program if using virtualenv
      command=/opt/python/run/venv/bin/celery worker -A myappname --loglevel=INFO

      directory=/opt/python/current/app
      user=nobody
      numprocs=1
      stdout_logfile=/var/log/celery-worker.log
      stderr_logfile=/var/log/celery-worker.log
      autostart=true
      autorestart=true
      startsecs=10

      ; Need to wait for currently executing tasks to finish at shutdown.
      ; Increase this if you have very long running tasks.
      stopwaitsecs = 600

      ; When resorting to send SIGKILL to the program to terminate it
      ; send SIGKILL to its whole process group instead,
      ; taking care of its children as well.
      killasgroup=true

      ; if rabbitmq is supervised, set its priority higher
      ; so it starts first
      priority=998

      environment=$celeryenv"

      # Create the celery supervisord conf script
      echo "$celeryconf" | tee /opt/python/etc/celery.conf

      # Add configuration script to supervisord conf (if not there already)
      if ! grep -Fxq "[include]" /opt/python/etc/supervisord.conf
          then
          echo "[include]" | tee -a /opt/python/etc/supervisord.conf
          echo "files: celery.conf" | tee -a /opt/python/etc/supervisord.conf
      fi

      # Reread the supervisord config
      supervisorctl -c /opt/python/etc/supervisord.conf reread

      # Update supervisord in cache without restarting all services
      supervisorctl -c /opt/python/etc/supervisord.conf update

      # Start/Restart celeryd through supervisord
      supervisorctl -c /opt/python/etc/supervisord.conf restart celeryd

Я пытался сделать что-то подобное в PHP, но по какой-то причине я не мог заставить работника работать. Я переключился на AMI на сервере EC2 и с тех пор добился успеха.

Для тех, кто использует Elasticbeanstalk с Rails и Sidekiq. Вот коллекция расширений, которые в конечном итоге помогли мне:

https://gist.github.com/ctrlaltdylan/f75b2e38bbbf725acb6d48283fc2f174

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