Blog
So definieren Sie AWS ECS-Aufgaben-Images so, dass sie mit dem neuen ECS-Versionskonsistenzverhalten kompatibel sind

In diesem Blog stelle ich Ihnen zwei Möglichkeiten vor, wie Sie mit der neuen ECS-Image-Versionskonsistenz arbeiten können: Entweder Sie aktivieren die Unveränderlichkeit des ECR-Tags oder Sie fügen den Image-Digest zu allen Ihren Aufgabendefinitions-Images hinzu.
Konsistenz der ecs-Version
Seit dem 25. Juni 2024 erzwingt Amazon Elastic Container Service (Amazon ECS) die Konsistenz der Softwareversion für containerisierte Anwendungen. ECS zieht Images nicht mehr auf der Grundlage des in der Aufgabendefinition definierten Tags, sondern anhand des Digest des für die erste Aufgabe verwendeten Container-Images. Dadurch wird sichergestellt, dass alle Aufgaben mit derselben Aufgabendefinition mit genau demselben Image gestartet werden. Das Verschieben des Tags auf ein neues Bild hat KEINE Auswirkungen auf die bestehende Aufgabendefinition.
Dieses Verhalten verhindert die Verwendung von fließenden Tags für Bilder und kann zu einem Ausfall führen, wenn der Tag verschoben und das vorherige Bild, auf das er zeigte, gelöscht wird. In diesem Fall erhalten Sie Fehlermeldungen wie:
level=warning msg="reference for unknown type: " digest="sha256:52f6876d1f340f2b5991105854dd541e0b1aed76eb9cfe963fc95bec90265a86" remote="<ACCOUNT>.dkr.ecr.<REGION>.amazonaws.com/<REPOSITORY>@sha256:52f6876d1f340f2b5991105854dd541e0b1aed76eb9cfe963fc95bec90265a86"
level=info msg="Attempting next endpoint for pull after error: manifest unknown: Requested image not found"
Um dieses Problem zu vermeiden, gibt es zwei mögliche Lösungen:
- Aktivieren Sie die Unveränderbarkeit von Tags in Ihrem ECR-Image-Repository.
- Fügen Sie den Bildreferenzen in der Aufgabendefinition Bild-Digests hinzu.
Tag Unveränderlichkeit
Die Unveränderbarkeit von Tags wäre cool, da sie verhindert, dass Tags verschoben werden, aber leider ist es ein Alles-oder-Nichts-Schalter. Es ist jedoch üblich, dass Container-Images symbolische Tags haben, die auf das neueste Image, die neueste Hauptversion oder die letzte Nebenversion verweisen. Das neueste Tag wird z.B. für Integrationstests verwendet, während die Tags für die Haupt- und Nebenversion die Anwendung von Sicherheitsupdates ermöglichen. Zum Beispiel sind zum Zeitpunkt der Erstellung dieses Artikels die folgenden Tags vorhanden:
alpine:latest
alpine:3
alpine:3.20
zeigen alle auf die Version 3.20.1 des Alpen-Images. Die Unveränderlichkeit von Tags bietet nicht genug feinkörnige Kontrolle, um dies zu ermöglichen. Um mit dem neuen Verhalten arbeiten zu können, empfehlen wir Ihnen daher, Ihre Bildreferenzen in den Aufgabendefinitionen mit dem Image Digest zu aktualisieren.
Bildreferenzen mit Digest aktualisieren
Bei der Docker-Container-Image-Referenz können Sie sowohl das Tag als auch den Digest angeben. Der Digest hat Vorrang, so dass der Tag nur als Metainformation dient. Ein Beispiel: die Image-Referenz:
mvanholsteijn/paas-monitor:3.1.0
kann geschrieben werden als:
mvanholsteijn/paas-monitor:3.1.0@sha256:c0717cab9....
Eine Bilddefinition mit einem Digest stellt sicher, dass die Aufgabendefinition dem Konsistenzverhalten der neuen ECS-Softwareversion entspricht.
Digest zur Container-Image-Referenz hinzufügen
Im Jahr 2020 haben Wietse Venema und ich ein Dienstprogramm entwickelt, mit dem Containerreferenzen aktualisiert werden können, so dass sie den Digest enthalten, während der Tag als menschenlesbarer Name erhalten bleibt. Nehmen wir zum Beispiel die folgende Aufgabendefinition:
{
"taskDefinitionArn": "arn:aws:ecs:eu-central-1:123456789012:task-definition/paas-monitor:2",
"containerDefinitions": [
{
"name": "paas-monitor",
"image": "mvanholsteijn/paas-monitor:3.1.0"
Sie können den Digest aktualisieren und der Container-Image-Referenz hinzufügen, indem Sie eingeben:
$ cru update --image-reference mvanholsteijn/paas-monitor:3.4.0 --resolve-digest .
2024/07/29 07:56:29 resolving repository mvanholsteijn/paas-monitor Tag 3.4.0 to Digest sha256:fdcfbed7e0a7beb8738e00fe8961c8e33e17bdeee94eab52cb8b85de1d04d024
2024/07/29 07:56:29 INFO: updating reference mvanholsteijn/paas-monitor:3.1.0 to mvanholsteijn/paas-monitor:3.4.0@sha256:fdcfbed7e0a7beb8738e00fe8961c8e33e17bdeee94eab52cb8b85de1d04d024 in paas-monitor.json
Wie Sie sehen können, aktualisiert cru die Bildreferenz und fügt die Zusammenfassung hinzu:
{
"taskDefinitionArn": "arn:aws:ecs:eu-central-1:123456789012:task-definition/paas-monitor:2",
"containerDefinitions": [
{
"name": "paas-monitor",
"image": "mmvanholsteijn/paas-monitor:3.4.0@sha256:fdcfbed7e0a7beb8738e00fe8961c8e33e17bdeee94eab52cb8b85de1d04d024"
Jetzt enthält die Bildreferenz sowohl das Tag als auch den Digest. ECS ignoriert das Tag und verwendet den Digest, während für Menschen die semantische Relevanz des Tags weiterhin gegeben ist.
Fazit
Die Versionskonsistenz von Amazon ECS stellt sicher, dass alle ECS-Aufgaben einer Aufgabendefinition das exakt gleiche Container-Image verwenden, wenn sie in einem Cluster bereitgestellt werden. Leider war diese Änderung unangekündigt und hat eine ganze Reihe von Arbeitsabläufen in der realen Welt zerstört. Es wäre schön gewesen, wenn AWS dieses Verhalten als Umschaltfunktion in der ECS-Aufgabendefinition oder im ECS-Cluster verfügbar gemacht hätte. Eine weitere Verbesserung wäre, wenn die Unveränderlichkeit der Tags auf der Grundlage des Tags selektiv eingestellt werden könnte.
Um Überraschungen zu vermeiden, aktivieren Sie die Tag-Immutability in Ihren ECR-Repositories oder nehmen Sie den Digest in die Container-Image-Referenzen Ihrer ECS-Aufgabendefinition auf.
Bild von Monica Volpin aus Pixabay
Verfasst von

Mark van Holsteijn
Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.
Unsere Ideen
Weitere Blogs
Contact



