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
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:
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 .celeryconf
qui contient le fichier de configuration Sous forme de chaîne, qui comprend les variables env. Analysées précédemment.celeryd.conf
, un fichier de configuration Pour le démon céleri.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
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.