Oto jak dodałem zadanie crona do Elastic Beanstalk:
Utwórz folder w katalogu głównym aplikacji o nazwie .ebextensions, jeśli jeszcze nie istnieje. Następnie utwórz plik konfiguracyjny w folderze .ebextensions. W celach ilustracyjnych użyję example.config. Następnie dodaj to do 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
To jest plik konfiguracyjny YAML dla Elastic Beanstalk. Podczas kopiowania tego do edytora tekstu upewnij się, że używa on spacji zamiast tabulatorów. W przeciwnym razie otrzymasz błąd YAML, gdy przekażesz to do EB.
Więc to, co to robi, to utworzenie polecenia o nazwie 01_some_cron_job. Polecenia są uruchamiane w kolejności alfabetycznej, więc 01 upewnia się, że jest uruchomione jako pierwsze polecenie.
Następnie polecenie pobiera zawartość pliku o nazwie some_cron_job.txt i dodaje ją do pliku o nazwie some_cron_job w /etc/cron.d.
Następnie polecenie zmienia uprawnienia w pliku /etc/cron.d/some_cron_job.
Klucz Leader_only zapewnia, że polecenie zostanie uruchomione tylko na instancji ec2, która jest uważana za lidera. Zamiast uruchamiać na każdej instancji ec2, którą możesz mieć uruchomioną.
Następnie utwórz plik o nazwie some_cron_job.txt w folderze .ebextensions. W tym pliku umieścisz swoje zadania cron.
Na przykład:
# The newline at the end of this file is extremely important. Cron won't run without it.
* * * * * root /usr/bin/php some-php-script-here > /dev/null
Więc to zadanie crona będzie uruchamiane co minutę o każdej godzinie każdego dnia jako użytkownik root i odrzuca dane wyjściowe do / dev / null. / usr / bin / php to ścieżka do pliku php. Następnie zamień część-php-script-here na ścieżkę do twojego pliku php. To oczywiście zakłada, że twoje zadanie cron musi uruchamiać plik PHP.
Upewnij się również, że plik some_cron_job.txt ma znak nowej linii na końcu pliku, tak jak mówi komentarz. W przeciwnym razie cron nie będzie działać.
Aktualizacja:
występuje problem z tym rozwiązaniem, gdy Elastic Beanstalk skaluje Twoje instancje. Na przykład, powiedzmy, że masz jedno wystąpienie z uruchomionym zadaniem cron. Zyskujesz wzrost ruchu, więc Elastic Beanstalk skaluje Cię do dwóch instancji. Leader_only zapewni, że między dwiema instancjami będzie działać tylko jedno zadanie cron. Twój ruch spada, a Elastic Beanstalk skaluje Cię do jednego wystąpienia. Ale zamiast zakończyć drugą instancję, Elastic Beanstalk kończy pierwszą instancję, która była liderem. Nie masz teraz uruchomionych żadnych zadań cron, ponieważ działały one tylko w pierwszej instancji, która została zakończona. Zobacz komentarze poniżej.
Aktualizacja 2:
Po prostu wyjaśniam to na podstawie poniższych komentarzy: AWS ma teraz ochronę przed automatycznym zakończeniem instancji. Po prostu włącz go na swojej instancji lidera i gotowe. - Nicolás Arévalo 28 października 2016 o 9:23