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:
- 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. - 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. - Esta variable se canaliza en un archivo llamado
celeryd.conf
, un archivo de configuración de supervisión para el daemon de apio. - 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.