Wir haben eine Aufgabe, die einige Konfigurationsdateien von einer externen Datenquelle lädt. Nach dem Hochladen der Einstellungen möchten wir in der Lage sein, alle Aufgaben in einem Dienst neu zu starten, damit die Einstellungen auf alle Instanzen übertragen werden.
Was ist der beste Weg, um alle Dienste neu zu starten?
Wir haben eine "Problemumgehung", bei der die "Anzahl der Aufgaben" auf 0 gesetzt und dann gesichert wird. Dies ist jedoch definitiv nicht die Vorgehensweise und hat Ausfallzeiten.
amazon-web-services
docker
amazon-ecs
Dennkster
quelle
quelle
Antworten:
Verwenden des AWS CLI-Tools:
quelle
Was Sie tun möchten, entspricht im Wesentlichen der erneuten Bereitstellung des Dienstes.
So stellen Sie den Dienst ohne Ausfallzeiten erneut bereit:
Dies sollte neue Aufgaben für die neue Aufgabendefinition starten und dann die alten Aufgaben für die alte Aufgabendefinition beenden, wodurch die Aufgaben ohne Ausfallzeiten effektiv neu gestartet werden.
Siehe: UpdateService
quelle
das hat bei mir funktioniert:
Die Aufgaben werden dann auf denselben Instanzen neu erstellt.
Wenn Sie neue Instanzen benötigen, verwenden Sie Folgendes:
quelle
Die Aufgabe als Baustein von ECS kann durch einen StopTask- Aufruf gestoppt werden . Der Dienst besteht aus zugrunde liegenden Aufgaben, die mit demselben API-Aufruf gestoppt werden können. Hier fehlt nur ein Teil der Ergebnisse des ListTasks- Aufrufs mit definierten Familienparametern . Ich habe eine einfache Lambda-Funktion geschrieben, die Ihnen dabei helfen kann.
quelle
Ich erweitere die Antwort von @ user326608 oben (danke für den Einblick!).
Dadurch werden ALLE AUFGABEN FÜR ALLE DIENSTLEISTUNGEN FÜR EINEN CLUSTER neu gestartet, indem alle seine Aufgaben gestoppt werden. Jeder Dienst startet dann automatisch die
X
Anzahl der neuen Aufgaben, woX
sich die Dienste befindendesired task count
.quelle
Basierend auf der Amazon-Dokumentation sollten Sie in der Lage sein, die fraglichen Vorgänge mithilfe der UpdateService-API-Aufrufe zu skripten . Unter dem vorherigen Link sind einige Codebeispiele verfügbar. Möglicherweise sollten Sie sich anpassen können. Es scheint, als wäre das Schreiben eines Skripts zum erneuten Laden der Dienste mithilfe der entsprechenden Aufgabendefinition nach den Aktualisierungen der Aufgabenkonfigurationen die eleganteste Lösung für das Problem.
Es gibt weitere Dokumentationen zur Verwendung von AWS CLI mit ECS, die anscheinend der einfachste Weg sind, mit Batch-Skripten beim Neustart von Diensten umzugehen.
quelle
Funktioniert hervorragend https://github.com/fdfk/ecsServiceRestart
quelle
Ich habe daran gearbeitet. Es wäre sehr nützlich, wenn Sie jeweils eine Aufgabe zuverlässig neu starten könnten. Das folgende Skript verwende ich jetzt. Es ist ziemlich vorsichtig. Erfordert, dass Sie für jede Aufgabe die Eingabetaste drücken. Es gibt einen Befehl, der darauf wartet, dass der Dienst stabil ist. Dies bedeutet jedoch nicht, dass die Aufgabe fehlerfrei ist. Und ich könnte eine Zeitverzögerung setzen. Aber am Ende, wenn die Dinge schlecht laufen, würde das Skript die App nur langsam beenden. So...
quelle
Ich habe ein Python Boto3-Skript, das die folgenden Funktionen ausführt:
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']:
Wenn die while-Schleife nicht mehr wahr ist - was bedeutet, dass sowohl die laufende als auch die gewünschte Anzahl gleich sind, stoppen Sie die nächste Aufgabe in der Liste.
Dies ist der tatsächliche Ablauf und ich kann den tatsächlichen Code nicht anzeigen, da ich noch bei meinem aktuellen Job beschäftigt bin und mein gesamter Code zu ihnen gehört :)
quelle