web-dev-qa-db-ja.com

AWS Elastic Beanstalkでワーカーをどのように実行しますか?

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

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

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

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
43
Maxime P

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

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

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

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

  1. celeryenv変数には、virutalenv環境が監視付き表記に従う形式で格納されます。これは、環境変数のコンマ区切りリストです。
  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
71
yellowcap

PHP=で同様のことをしようとしましたが、なんらかの理由でワーカーを実行し続けることができませんでした。EC2サーバーでAMIに切り替えて以来、成功しています。

3

Rails&SidekiqでElasticbeanstalkを使用している場合。最終的に私のためにトリックを実行したebextensionsのコレクションを次に示します。

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

0
Dylan Pierce