Начните SQS сельдерея на Elastic Beanstalk - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь запустить сельдерея на EB, но получаю ошибку, которая мало что объясняет.

Команда в файле конфигурации в .ebextensions dir:

03_celery_worker:
  command: "celery worker --app=config --loglevel=info -E --workdir=/opt/python/current/app/my_project/"

Перечисленная команда отлично работает на моем локальном компьютере (просто измените параметр workdir).

Ошибки от EB:

Не удалось выполнить действие, поскольку: /opt/python/run/venv/local/lib/python3.6/site-packages/celery/platforms.py:796: RuntimeWarning: вы запускаете работника с привилегиями суперпользователя: это абсолютно не рекомендуется!

и

Запуск нового HTTPS-соединения (1): eu-west-1.queue.amazonaws.com (ElasticBeanstalk :: ExternalInvocationError)

Я обновил команду celery worker с параметром --uid=2, и ошибка привилегий исчезла, но выполнение команды все еще не удалось из-за

ExternalInvocationError

Есть предложения, что я делаю не так?

1 Ответ

0 голосов
/ 05 июля 2018

ExternalInvocationError

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

Обновление: Необходимо создать файл конфигурации в каталоге .ebextensions. Я назвал это celery.config. Ссылка на пост выше предоставляет скрипт, который работает почти нормально. Нужно сделать некоторые незначительные дополнения для работы на 100% правильно. У меня были проблемы с расписанием периодических заданий ( сельдерей, бит ). Ниже приведены инструкции по исправлению:

  1. Установить (добавить к требованиям) django-celery beat pip install django-celery-beat, добавить его в установленные приложения и использовать параметр --scheduler при запуске сельдерея. Инструкции здесь .

  2. В скрипте вы указываете пользователя, который запускает скрипт. Для сельдерея это celery пользователь, который был добавлен ранее в сценарий (если не существует). Когда я попытался запустить ритм сельдерея, я получил ошибку PermissionDenied . Это означает, что пользователь celery не имеет всех необходимых прав. используя ssh, я вошел в EB, посмотрел список всех пользователей (cat /etc/passwd) и решил использовать daemon user.

Перечисленные шаги разрешают ошибки удара сельдерея. Обновленный конфигурационный файл со скриптом находится ниже (celery.config): `` ` файлы: "/Opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_celeryd.sh": режим: "000755" владелец: root группа: корень содержание: | #! / usr / bin / env bash

  # Create required directories
  sudo mkdir -p /var/log/celery/
  sudo mkdir -p /var/run/celery/

  # Create group called 'celery'
  sudo groupadd -f celery
  # add the user 'celery' if it doesn't exist and add it to the group with same name
  id -u celery &>/dev/null || sudo useradd -g celery celery
  # add permissions to the celery user for r+w to the folders just created
  sudo chown -R celery:celery /var/log/celery/
  sudo chown -R celery:celery /var/run/celery/

  # Get django environment variables
  celeryenv=`cat /opt/python/current/env | tr '\n' ',' | sed 's/%/%%/g' | 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 configuration script
  celeryconf="[program:celeryd]
  directory=/opt/python/current/app
  ; Set full path to celery program if using virtualenv
  command=/opt/python/run/venv/bin/celery worker -A config.celery:app --loglevel=INFO --logfile=\"/var/log/celery/%%n%%I.log\" --pidfile=\"/var/run/celery/%%n.pid\"

  user=celery
  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 = 60

  ; 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 CELERY BEAT configuraiton script
  celerybeatconf="[program:celerybeat]
  ; Set full path to celery program if using virtualenv
  command=/opt/python/run/venv/bin/celery beat -A config.celery:app --loglevel=INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler --logfile=\"/var/log/celery/celery-beat.log\" --pidfile=\"/var/run/celery/celery-beat.pid\"

  directory=/opt/python/current/app
  user=daemon
  numprocs=1
  stdout_logfile=/var/log/celerybeat.log
  stderr_logfile=/var/log/celerybeat.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 = 60

  ; 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=999

  environment=$celeryenv"

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

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

  # Enable supervisor to listen for HTTP/XML-RPC requests.
  # supervisorctl will use XML-RPC to communicate with supervisord over port 9001.
  # Source: https://askubuntu.com/questions/911994/supervisorctl-3-3-1-http-localhost9001-refused-connection
  if ! grep -Fxq "[inet_http_server]" /opt/python/etc/supervisord.conf
    then
      echo "[inet_http_server]" | tee -a /opt/python/etc/supervisord.conf
      echo "port = 127.0.0.1:9001" | 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
  supervisorctl -c /opt/python/etc/supervisord.conf restart celerybeat

команды: 01_killotherbeats: команда: "ps auxww | grep 'celery beat' | awk '{print $ 2}' | sudo xargs kill -9 || true" ignoreErrors: true 02_restartbeat: команда: "supervisorctl -c /opt/python/etc/supervisord.conf перезапустить celerybeat" leader_only: правда `` ` Одна вещь, на которую нужно обратить внимание: в моем проекте файл celery.py находится в каталоге config, поэтому я пишу -A config.celery:app при запуске работник сельдерея и удар сельдерея

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...