47

AWSElasticBeanstalkでDjangoアプリケーションを起動しています。セロリを実行するために、バックグラウンドタスクまたはワーカーを実行したいと思います。

それが可能かどうかはわかりません。はいの場合、どのようにそれを達成できますか?

これが私が今していることですが、これは毎回イベントタイプエラーを生成しています。

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
4

3 に答える 3

71

@chris-wheadon がコメントで提案したように、セロリをバックグラウンドでデーモンとして実行するようにしてください。AWS Elastic Beanstalk はすでに Supervisord を使用していくつかのデーモン プロセスを実行していますしたがって、それを利用して celeryd を実行し、このためのカスタム AMI を作成することを避けることができます。それは私にとってうまく機能します。

私がしていることは、アプリが EB によってインスタンスにデプロイされた後、プログラムで celeryd 構成ファイルをインスタンスに追加することです。注意が必要なのは、デーモンに必要な環境変数 (アプリで S3 やその他のサービスを使用する場合の AWS アクセス キーなど) をファイルで設定する必要があることです。

以下に、私が使用するスクリプトのコピーを示します。このスクリプトを.ebextensions、EB 環境を構成するフォルダーに追加します。

セットアップ スクリプトは、すべての EB インスタンスに存在する/opt/elasticbeanstalk/hooks/appdeploy/post/フォルダー ( documentation ) にファイルを作成します。そこにあるすべてのシェル スクリプトは、展開後に実行されます。そこに配置されたシェル スクリプトは、次のように動作します。

  1. 変数にはceleryenv、virutalenv 環境が、supervisord 表記に従った形式で格納されます。これは、env 変数のコンマ区切りリストです。
  2. 次に、スクリプトはceleryconf、構成ファイルを文字列として含む変数を作成します。これには、以前に解析された環境変数が含まれます。
  3. 次に、この変数はceleryd.conf、celery デーモンの Supervisord 構成ファイルである というファイルにパイプされます。
  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
于 2014-03-20T13:00:00.453 に答える