web-dev-qa-db-fra.com

Comment dirigez-vous un travailleur avec AWS Elastic Beanstalk?

Je lance une application Django sur le haricot élastique aws. Je voudrais exécuter une tâche en arrière-plan ou un travailleur afin de pouvoir exécuter le céleri.

Je ne trouve pas si c'est possible ou non. Si oui, comment cela pourrait-il être réalisé?

Voici ce que je suis en train de faire actuellement, mais cela produit à chaque fois une erreur de type événement.

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

Comme @ chris-wheadon l'a suggéré dans son commentaire, vous devriez essayer d'exécuter le céleri en tant que démon en arrière-plan. AWS Elastic Beanstalk utilise supervisord déjà pour exécuter certains processus de démon. Vous pouvez donc tirer parti de cela pour exécuter celeryd et éviter de créer une AMI personnalisée à cet effet. Cela fonctionne bien pour moi.

Ce que je fais est d'ajouter par programme un fichier de configuration celeryd à l'instance après le déploiement de l'application par EB. La difficulté réside dans le fait que le fichier doit définir les variables d’environnement requises pour le démon (telles que les clés d’accès AWS si vous utilisez S3 ou d’autres services dans votre application).

Ci-dessous, une copie du script que j'utilise, ajoutez ce script à votre dossier .ebextensions qui configure votre environnement EB. 

Le script d'installation crée un fichier dans le dossier /opt/elasticbeanstalk/hooks/appdeploy/post/ ( documentation ) qui réside sur toutes les instances EB. Tous les scripts Shell présents seront exécutés après le déploiement. Le script Shell qui y est placé fonctionne comme suit:

  1. Dans la variable celeryenv, l’environnement virutalenv est stocké au format Suivant la notation supervisord. Il s'agit d'une liste de variables env séparées par des virgules .
  2. Ensuite, le script crée une variable celeryconf qui contient le fichier de configuration Sous forme de chaîne, qui comprend les variables env. Analysées précédemment.
  3. Cette variable est ensuite transférée dans un fichier appelé celeryd.conf, un fichier de configuration Pour le démon céleri.
  4. Enfin, le chemin du fichier de configuration nouvellement créé est ajouté au fichier supervisord.conf Principal, s'il ne s'y trouve pas déjà.

Voici une copie du script:

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
66
yellowcap

J'essayais de faire quelque chose de similaire dans PHP mais, pour une raison quelconque, je ne pouvais pas laisser le travailleur en fonction. Je suis passé à une AMI sur un serveur EC2 et je rencontre du succès depuis.

1