Voici comment j'ai ajouté une tâche cron à Elastic Beanstalk :
Créez un dossier à la racine de votre application appelé .ebextensions s'il n'existe pas déjà. Ensuite, créez un fichier de configuration à l'intérieur du dossier .ebextensions. J'utiliserai example.config à des fins d'illustration. Ensuite, ajoutez ceci à example.config
container_commands:
01_some_cron_job:
command: "cat .ebextensions/some_cron_job.txt > /etc/cron.d/some_cron_job && chmod 644 /etc/cron.d/some_cron_job"
leader_only: true
Ceci est un fichier de configuration YAML pour Elastic Beanstalk. Assurez-vous que lorsque vous copiez ceci dans votre éditeur de texte, votre éditeur de texte utilise des espaces au lieu de tabulations. Sinon, vous obtiendrez une erreur YAML lorsque vous pousserez ceci vers EB.
Ce que cela fait, c'est créer une commande appelée 01_some_cron_job. Les commandes sont exécutées par ordre alphabétique donc le 01 s'assure qu'elle est exécutée en premier.
La commande prend ensuite le contenu d'un fichier appelé some_cron_job.txt et l'ajoute à un fichier appelé some_cron_job dans /etc/cron.d.
La commande change ensuite les permissions sur le fichier /etc/cron.d/some_cron_job.
La clé leader_only assure que la commande est exécutée uniquement sur l'instance ec2 considérée comme le leader. Plutôt que de s'exécuter sur chaque instance ec2 que vous pourriez avoir en cours d'exécution.
Ensuite, créez un fichier appelé some_cron_job.txt à l'intérieur du dossier .ebextensions. Vous placerez vos tâches cron dans ce fichier.
Par exemple :
# Le saut de ligne à la fin de ce fichier est extrêmement important. Cron ne s'exécutera pas sans cela.
* * * * * root /usr/bin/php some-php-script-here > /dev/null
Ainsi, cette tâche cron s'exécutera toutes les minutes de toutes les heures de tous les jours en tant qu'utilisateur root et rejettera la sortie vers /dev/null. /usr/bin/php est le chemin vers php. Remplacez ensuite some-php-script-here par le chemin vers votre fichier php. Cela suppose évidemment que votre tâche cron doit exécuter un fichier PHP.
Assurez-vous également que le fichier some_cron_job.txt a un saut de ligne à la fin du fichier comme le dit le commentaire. Sinon, cron ne s'exécutera pas.
Mise à jour : Il y a un problème avec cette solution lorsque Elastic Beanstalk met à l'échelle vos instances. Par exemple, disons que vous avez une instance avec la tâche cron en cours d'exécution. Vous recevez une augmentation du trafic donc Elastic Beanstalk vous met à l'échelle jusqu'à deux instances. La clé leader_only garantira que vous n'avez qu'une seule tâche cron en cours d'exécution entre les deux instances. Votre trafic diminue et Elastic Beanstalk vous met à l'échelle jusqu'à une instance. Mais au lieu de terminer la deuxième instance, Elastic Beanstalk termine la première instance qui était leader. Vous n'avez désormais aucune tâche cron en cours d'exécution puisqu'elles étaient uniquement en cours d'exécution sur la première instance qui a été terminée. Voir les commentaires ci-dessous.
Mise à jour 2 : Pour clarifier les commentaires ci-dessous : AWS a maintenant une protection contre la terminaison automatique des instances. Activez simplement cette protection sur votre instance leader et vous êtes prêt à partir. – Nicolás Arévalo 28 oct. 2016 à 9:23
1 votes
Le commandement est-il correct? Je veux dire... cela pourrait être : commande: echo "*/1 * * * * root php /etc/httpd/myscript.php" > /etc/cron.d/something Peu importe, je vous suggère d'utiliser le drapeau leader_only, sinon toutes les machines lanceront ce job cron en même temps
0 votes
Oui! en utilisant certainement le drapeau leader_only, je vais essayer de changer la commande.