sirve que para elasticbeanstalk elastic ec2 deploy aws django amazon-web-services celery elastic-beanstalk

django - elasticbeanstalk - para que sirve elastic beanstalk



¿Cómo se ejecuta un trabajador con AWS Elastic Beanstalk? (2)

Como @ chris-wheadon sugirió en su comentario, debería intentar ejecutar el apio como un deamon en el fondo. AWS Elastic Beanstalk ya utiliza supervisord para ejecutar algunos procesos deamon. Entonces puede aprovechar eso para ejecutar apical y evitar crear un AMI personalizado para esto. Funciona bien para mí.

Lo que hago es agregar programáticamente un archivo de configuración apilado a la instancia después de que EB lo implemente. La parte difícil es que el archivo necesita establecer las variables de entorno requeridas para el deamon (como las teclas de acceso AWS si usa S3 u otros servicios en su aplicación).

A continuación hay una copia del script que uso, agregue este script a su carpeta .ebextensions que configura su entorno EB.

La secuencia de comandos de instalación crea un archivo en la carpeta no documentada /opt/elasticbeanstalk/hooks/appdeploy/post/ que vive en todas las instancias de EB. Cualquier script de shell allí se ejecutará después de la implementación. El script de shell que se coloca allí funciona de la siguiente manera:

  1. En la variable celeryenv , el entorno virutalenv se almacena en un formato que sigue la notación de supervisión. Esta es una lista de variables env separadas por comas.
  2. A continuación, la secuencia de comandos crea una variable celeryconf que contiene el archivo de configuración como una cadena, que incluye las variables env analizadas previamente.
  3. Esta variable se canaliza en un archivo llamado celeryd.conf , un archivo de configuración de supervisión para el daemon de apio.
  4. Finalmente, la ruta al archivo de configuración recién creado se agrega al archivo supervisord.conf principal, si aún no está allí.

Aquí hay una copia de la secuencia de comandos:

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

Estoy lanzando una aplicación django en beanstalk elástico. Me gustaría ejecutar la tarea de fondo o el trabajador para ejecutar el apio.

No puedo encontrar si es posible o no. Si es así, cómo se podría lograr.

Esto es lo que estoy haciendo en este momento, pero esto está produciendo cada vez un error tipo evento.

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

Gracias por la ayuda,


Estaba tratando de hacer algo similar en PHP, pero por alguna razón no pude mantener al trabajador ejecutándose. Cambié a una AMI en un servidor EC2 y he tenido éxito desde entonces.