Mamy zadanie, które ładuje niektóre pliki konfiguracyjne z zewnętrznego źródła danych. Po przesłaniu ustawień chcielibyśmy móc zrestartować wszystkie zadania w usłudze, aby ustawienia zostały rozpowszechnione we wszystkich instancjach.
Jaki jest najlepszy sposób na ponowne uruchomienie wszystkich usług?
Mamy „obejście” polegające na ustawieniu „liczby zadań” na 0, a następnie na wykonanie kopii zapasowej, ale zdecydowanie nie tak powinno się to robić i ma przestoje.
amazon-web-services
docker
amazon-ecs
Dennkster
źródło
źródło
Odpowiedzi:
Za pomocą narzędzia AWS CLI:
źródło
To, co chcesz zrobić, to w zasadzie to samo, co ponowne wdrożenie Usługi.
Aby ponownie wdrożyć usługę bez przestojów:
Powinno to uruchomić nowe zadania dla nowej definicji zadania, a następnie zabić stare zadania dla starej definicji zadania, skutecznie ponownie uruchamiając zadania bez przestoju.
Zobacz: UpdateService
źródło
to działało dla mnie:
zadania są następnie odtwarzane w tych samych instancjach.
jeśli potrzebujesz nowych instancji, użyj tego:
źródło
Zadanie jako element konstrukcyjny ECS można zatrzymać za pomocą wywołania StopTask . Usługa składa się z podstawowych zadań, które można zatrzymać za pomocą tego samego wywołania interfejsu API. Jedynie brakująca część jest tutaj wyświetlana wokół wyników wywołania ListTasks ze zdefiniowanym parametrem rodziny . Napisałem prostą funkcję Lambda, która może ci w tym pomóc.
źródło
Rozwijam powyższą odpowiedź @ user326608 (dzięki za wgląd!).
Spowoduje to zrestartowanie WSZYSTKICH ZADAŃ DLA WSZYSTKICH USŁUG DLA Klastra poprzez zatrzymanie wszystkich jego zadań. Następnie każda usługa automatycznie uruchomi
X
liczbę nowych zadań, gdzieX
jest usługadesired task count
.źródło
W oparciu o dokumentację Amazon wydaje się, że powinieneś być w stanie napisać odpowiednie operacje za pomocą wywołań API UpdateService . Istnieje kilka przykładów kodu dostępnych pod poprzednim linkiem, wydaje się możliwe, że powinieneś być w stanie się dostosować. Wygląda na to, że napisanie skryptu, który zajmie się przeładowaniem usług przy użyciu odpowiedniej definicji zadania, po tym jak aktualizacje konfiguracji zadań będą najbardziej eleganckim rozwiązaniem problemu.
Jest więcej dokumentacji na temat używania AWS CLI z ECS, która wydaje się być najłatwiejszym sposobem radzenia sobie ze wsadowym skryptowaniem ponownego uruchamiania usług.
źródło
Działa świetnie https://github.com/fdfk/ecsServiceRestart
źródło
Pracowałem nad tym. Byłoby bardzo przydatne, aby móc ponownie uruchomić jedno zadanie na raz. Poniższy skrypt jest tym, którego teraz używam. To jest dość ostrożne. Wymaga ci powrotu za każde zadanie. Istnieje polecenie czekające na stabilizację usługi, ale nie oznacza to, że zadanie jest prawidłowe. I mógłbym wprowadzić opóźnienie czasowe. Ale w końcu, jeśli coś pójdzie nie tak, skrypt po prostu powoli zabije aplikację. Więc...
źródło
Mam skrypt boto3 python, który wykonuje FF:
ecs_client.list_tasks(cluster=mycluster,serviceName=myservice,desiredStatus='RUNNING')
ecs_client.stop_task(cluster=mycluster,task=mytask)
ecs_client.describe_services(cluster=mycluster,services=[myservice])
while myservice['services'][0]['runningCount'] < myservice['services'][0]['desiredCount']:
Jeśli pętla while nie jest już prawdziwa - co oznacza, że liczba uruchomień i żądanych jest równa, zatrzymaj następne zadanie na liście.
To jest rzeczywisty przepływ i nie jestem w stanie wyświetlić rzeczywistego kodu, ponieważ wciąż jestem zatrudniony w mojej obecnej pracy i cały mój kod należy do nich :)
źródło