Ich würde die ECS-Containerinstanzen (ich spreche von den Docker-Hosts - ich mag die AWS-Terminologie hier nicht) und die Bereitstellung als zwei separate Dinge beibehalten.
Bringen Sie Ihren ECS-Stack zum Laufen. Sie können es über CloudFormation und Auto-Scaling-Gruppen verwalten, das ist in Ordnung. Man denke nur an den Cluster als Plattform , wo Sie bereitstellen werden , um nicht etwas , was Sie brauchen redeploy .
Für CDs ist es bei weitem die einfachste Methode, die Servicedefinition zu aktualisieren, um eine neue Aufgabendefinition zu verwenden, und ECS die Container für Sie aktualisieren zu lassen.
Jedes Mal, wenn eine Aufgabe gestartet wird, führt ECS das Docker-Pull-Image-Tag aus, auch wenn das Image lokal vorhanden ist, um sicherzustellen, dass die neueste Version des Image-Tags vorhanden ist. Das verwendete Image-Tag spielt also keine Rolle (das Tag muss nicht bei jedem Build geändert werden).
Das bedeutet, dass Sie myimage erstellen können: immer und immer wieder, um es einfach bereitzustellen.
Was Sie brauchen, ist eine Aufgabendefinition, bei der image = myimage: latest ist. Erstellen Sie einen Dienst mit dieser Aufgabendefinition, und jedes Mal, wenn ECS eine Aufgabe (eine Instanz Ihres Dienstes) startet, ist dies das aktuellste von Ihnen erstellte "myimage: latest".
Von dort aus fehlt nur ein Teil des Puzzles. In CodeDeploy können Sie eine neue Revision Ihrer Aufgabendefinition erstellen und Ihren Dienst aktualisieren, und ECS erstellt automatisch neue Aufgaben für diese Revision und entferne die alten Aufgaben.
Ein Beispiel:
Angenommen, Sie haben einen Dienst namens MyService erstellt. Sie haben diesen Dienst so konfiguriert, dass 2 Aufgaben für die Aufgabendefinition MyTaskDefinition ausgeführt werden: 1 (Revision 1). In dieser Aufgabendefinition haben Sie eine Containerdefinition, deren Image auf "myimage: latest" festgelegt ist.
- Gestern hast du myimage erstellt: spätestens mit der ID (SHA) 365d8f7bf565.
- Ihre Containerinstanz ABC führt eine Task mit dem Namen MyTaskDefinition- 1 -containerName-someLongId aus. Wenn Sie diesen Container untersuchen, wird das Bild "sha256: 365d8f7bf565 .........." ausgeführt.
- Ihre andere Containerinstanz-DEF führt eine andere Task aus. Es hat einen ähnlichen Namen (nur die ID unterscheidet sich), aber es läuft das gleiche Bild.
- Sie drücken eine Änderung an Ihrem Repo.
- CodePipeline übernimmt diese Änderung, erstellt und veröffentlicht das Bild in ECR.
- Das neue Docker-Image ist auch mein Bild: Neueste, aber seine ID (SHA) ist f7ec5e54ac96
- Jetzt müssen Sie Ihrer Pipeline einen Schritt hinzufügen, um Lambda-Funktionen und das AWS NodeJS SDK für einige Aufrufe an Ihren Cluster zu verwenden:
- Erstellen Sie eine neue Aufgabendefinition (genau wie zuvor). Das wird MyTaskDefinition sein: 2
- Aktualisieren Sie Ihren MyService, um MyTaskDefinition zu verwenden: 2 (anstelle von 1)
- ECS wird neue Aufgaben erstellen. Die Containernamen lauten MyTaskDefinition- 2 -containerName-someLongId. Wenn Sie diese Container überprüfen, werden Sie feststellen, dass auf ihnen "sha256: f7ec5e54ac96 ......." ausgeführt wird. Vielleicht haben Sie 2 Aufgaben auf der Container-Instanz ABC, vielleicht werden sie weggesprüht (das hängt von der Konfiguration Ihres Dienstes ab)
- Nach einiger Zeit entfernt ECS die alte Aufgabe MyTaskDefinition-1-containerName-someLongId aus ABC und DEF.
Hinweis: Sie müssen tatsächlich keine neue Aufgabendefinition erstellen. Wenn Sie möchten, können Sie stattdessen die Aufgabenliste des Dienstes abrufen und sie einzeln manuell stoppen. Sie sollten warten, bis ECS eine Task neu gestartet hat, bevor Sie eine neue Task stoppen (d. H. Den ersten Container stoppen, warten, bis ECS ihn ersetzt, den zweiten Container stoppen). Wenn ECS den Container neu startet, wird das neueste myimage abgerufen: das zuletzt erstellte, wie zuvor erläutert. Ich denke nur, dass das Erstellen einer neuen Aufgabendefinition einfacher und weniger fehleranfällig ist (es ist keine Logik erforderlich, um zu warten und zu überprüfen, ECS übernimmt das fortlaufende Update für Sie, wenn Sie eine neue Aufgabendefinition haben).