Wie lösche ich ungetaggte und ältere AWS ECR-Images?

Effiziente Verwaltung von Container-Images in AWS ECR

Amazon ECR ist nahtlos in Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) und AWS Lambda integriert und optimiert so Ihren gesamten Workflow, von der Entwicklung bis zur Produktionsumgebung.

Durch das Hosting von Images in einer hochskalierbaren und zuverlässigen Architektur stellt Amazon ECR sicher, dass Ihre Containeranwendungen stets verfügbar und performant sind. Die regelmäßige Bereinigung von ungetaggten und veralteten Images ist dabei von entscheidender Bedeutung für die Aufrechterhaltung einer sauberen und effizienten Umgebung.

Moderne Anwendungen werden oft als Microservices implementiert. Ein Microservice ist im Grunde ein Container, der den gesamten Code und alle seine Abhängigkeiten kapselt. Dies ermöglicht eine schnelle und zuverlässige Ausführung der Anwendung in jeder beliebigen Computerumgebung. Dank ihrer Portabilität, ihrer geringen Größe und ihrer Flexibilität sind Container zu einer bevorzugten Methode für die Bereitstellung zeitgemäßer Applikationen geworden.

Container werden anhand von schreibgeschützten Vorlagen, sogenannten Images, erstellt. Diese Images müssen in einer zentralen Registry gespeichert werden, damit sie von jedem autorisierten System abgerufen werden können.

Hier kommt die Container-Registry ins Spiel. Früher wurde oft DockerHub für die Speicherung dieser Images und Artefakte genutzt. Wenn Sie jedoch AWS Cloud-Services verwenden, ist AWS ECR eine naheliegende und empfehlenswerte Alternative zu DockerHub.

AWS ECR ist eine vollständig verwaltete Container-Registry, die leistungsstarkes Hosting bietet. Sie können damit Anwendungs-Images und Artefakte in Form von öffentlichen und privaten Repositories bereitstellen.

Tagtäglich verschieben und ziehen zahlreiche AWS-gehostete Anwendungen Millionen von Images und Anwendungsartefakten in bzw. aus ECR-Repositories.

In diesem Artikel werden wir uns damit auseinandersetzen, wie Sie veraltete und unnötige AWS ECR-Images löschen und Ihre ECR-Repositories sauber halten können.

Die Notwendigkeit: Sofortiges Löschen von ungetaggten und alten Images!

Der primäre Grund für das Bereinigen von ECR-Repositories ist die Sicherstellung einer guten Entwicklungspraxis. In der Regel ist es nicht sinnvoll, Images älter als zehn Deployments in ECR-Umgebungen zu behalten. Dies ist auch darauf zurückzuführen, dass Rollbacks in der Branche zwar üblich sind, jedoch selten Änderungen von mehr als fünf früheren Artefakten zurückgesetzt werden müssen.

Einfacher ausgedrückt: Alle Images und Artefakte, die älter als fünf Deployments sind, sind in der Regel nicht mehr relevant. Die Strategievorgaben Ihres Unternehmens können sich ändern, aber diese Empfehlung gilt im Allgemeinen als bewährte Methode.

Das Tagging wird branchenweit eingesetzt, um die stabilsten, neuesten oder die fünf neuesten Images zu kennzeichnen. Im Laufe des Softwareentwicklungszyklus werden laufend neue Images generiert. Die alten Tags werden dabei durch neue ersetzt, wodurch ältere Images ungetaggt und ungenutzt bleiben.

Da Images und Artefakte oft sehr groß sind, fallen für deren Speicherung in ECR Gebühren an. Die Preise für AWS ECR betragen „0,10 $ pro GB/Monat für Daten, die in privaten oder öffentlichen Repositories gespeichert sind“.

Dieser Betrag mag gering erscheinen, aber bekanntlich macht die Masse den Unterschied. Wenn all diese Images über einen längeren Zeitraum gespeichert werden, können die AWS-Rechnungen erheblich ansteigen.

Daher ist es empfehlenswert, diese alten und ungetaggten Images aus Ihren ECR-Repositories zu löschen, da sie nicht mehr benötigt werden. Warum also behalten und dafür bezahlen?

Manuelles Löschen von AWS ECR-Images

Methode 1: Der GUI-Weg!

Schritt 1: Melden Sie sich bei Ihrem Amazon Web Services-Konto an und navigieren Sie zu dem Repository, das Sie bereinigen möchten.

Schritt 2: Hier sehen Sie das aktuelle Tag, das die stabilste Version kennzeichnet. Alle anderen Tags sind wahrscheinlich veraltet und können gelöscht werden. Wählen Sie einfach das gewünschte Image aus und klicken Sie auf „Löschen“.

Schritt 3: Bestätigen Sie den Löschvorgang.

Methode 2: Der CLI-Weg!

Um ein Image über die Befehlszeile (CLI) zu löschen, benötigen Sie Ihre AWS IAM-Zugangsdaten auf Ihrem Rechner und die erforderlichen IAM-Berechtigungen, um auf die Repositories zuzugreifen.

In diesem Fall gehen wir davon aus, dass dies bereits konfiguriert ist. Falls nicht, finden Sie in den AWS-Konfigurationsleitfäden detaillierte Anleitungen.

Wenn Sie nicht sicher sind, ob die AWS CLI auf Ihrem Rechner eingerichtet ist, können Sie dies mit folgendem Befehl überprüfen:

aws sts get-caller-identity

Nachdem die Konfiguration der AWS CLI bestätigt wurde, können Sie den folgenden Befehl verwenden, um ein ungetaggtes ECR-Image zu löschen:

aws ecr batch-delete-image --repository-name test-ecr-policy --image-ids imageTag=custom-image-6

Hier führen wir einen ähnlichen Vorgang wie in der GUI durch. Wir löschen das Image mit dem Tag ‚custom-image-6‘, das sich im Repository ‚test-ecr-policy‘ befindet.

Methode 3: Der Scripting-Weg!

Voraussetzung für diese Methode ist, dass AWS-Zugangsdaten auf dem ausführenden Computer konfiguriert sind.

Hier ist ein Skript zum Löschen von ungetaggten Images:

import boto3

client = boto3.client('ecr')

response = client.list_images(repositoryName="test-ecr-policy")

untaggedImageList = [image for image in response['imageIds'] if image['imageTag'] == 'custom-build-4']

response2 = client.batch_delete_image(repositoryName="aws-test-ecrpolicy", imageIds=untaggedImageList)

print(response2)

Die Antwort liefert Ihnen eine Liste der gelöschten Image-IDs sowie eventuelle Fehlermeldungen.

Automatisierte Löschmethoden für ECR-Images

Wenn Sie als DevOps-Ingenieur oder regelmäßiger Nutzer mit AWS ECR arbeiten, kennen Sie sicherlich die Herausforderungen beim manuellen Löschen von Images.

Das Ausführen von Skripten oder Befehlen kann den Prozess vereinfachen, aber eine automatische Lösung, die die Bilder eigenständig löscht, ohne dass Sie sich darum kümmern müssen, ist oft wünschenswert.

Hier gibt es gute Neuigkeiten: AWS ECR bietet die Möglichkeit, Lebenszyklusrichtlinien für Ihre Images festzulegen. Diese Richtlinien erlauben es Ihnen, Images nach einem bestimmten Zeitplan oder unter bestimmten Bedingungen automatisch löschen zu lassen. Sehen wir uns an, wie das funktioniert.

Methode 1: Der GUI-Weg!

Schritt 1: Navigieren Sie zum gewünschten Repository und wählen Sie im linken Menü „Lebenszyklusrichtlinie“. Klicken Sie darauf, um fortzufahren.

Schritt 2: Erstellen Sie eine neue Regel.

Schritt 3: ECR ermöglicht das Löschen von Images unter zwei Bedingungen: Wenn die Images ein bestimmtes Alter erreicht haben oder wenn sie mit einem Tag versehen bzw. nicht versehen sind. Sie können beispielsweise festlegen, dass Images nur für eine bestimmte Anzahl von Tagen aufbewahrt werden.

Wählen Sie die für Ihre Anforderungen passende Option. Sie können zum Beispiel alle ungetaggten Images löschen lassen, die einen Tag oder älter sind, oder wenn die Anzahl der ungetaggten Bilder einen bestimmten Wert überschreitet.

Vergessen Sie nicht, dass Sie diese Zahlen an Ihre Bedürfnisse anpassen können. Speichern Sie die Regel, um sie zu aktivieren.

Methode 2: Der CLI-Weg!

Der AWS ECR CLI-Befehl zum Festlegen einer Lebenszyklusrichtlinie lautet ‚put-lifecycle-policy‘.

Zuerst müssen Sie eine JSON-Datei erstellen, die die Richtlinienbedingungen definiert. Sie können diese Datei z.B. ‚policy.json‘ nennen.

Schauen wir uns die Elemente der Lebenszyklusrichtlinie genauer an:

rulePriority (Type: integer, Required: yes):

Regelpriorität von niedrig nach hoch. Regeln mit Priorität 1 werden zuerst angewendet, dann 2 usw. Jede Regel muss einen eindeutigen Prioritätswert haben.

Die Regelwerte müssen nicht aufeinanderfolgend sein. Regeln mit „Any“-Tags sollten die höchste Priorität und somit als letztes überprüft werden.

description (Type: string, Required: no):

Erläuterung der Funktion einer Regel in einer Lebenszyklusrichtlinie.

tagStatus (Type: string, Required: yes):

Überprüft, ob die hinzugefügte Lebenszyklusrichtlinie ein Image-Tag angibt. Gültige Werte sind „Tagged“, „Untagged“ oder „Any“. Wenn keine Angabe gemacht wird, werden alle Images ausgewertet. „Tagged“ erfordert einen ‚tagPrefixList‘-Wert. „Untagged“ erfordert, dass ‚tagPrefixList‘ weggelassen wird.

tagPrefixList (Type: list[string], Required: yes, only if tagStatus is set to tagged):

Wenn ‚tagStatus‘ auf „tagged“ gesetzt ist, benötigt die Lebenszyklusrichtlinie eine durch Kommas getrennte Liste von Image-Tag-Präfixen.

Mit dem Tag-Präfix ‚prod‘ können Sie beispielsweise alle Bilder auswählen, die mit ‚prod‘, ‚prod1‘, ‚prod2‘ usw. getaggt sind. Mehrere Tags wählen nur Bilder mit allen Tags aus.

countType (Type: string, Required: yes):

Geben Sie ‚countNumber‘ an, wenn ‚countType‘ ‚imageCountMoreThan‘ ist, um die Anzahl der Bilder in Ihrem Repository zu begrenzen.

Geben Sie ‚countUnit‘ und ‚countNumber‘ an, wenn ‚countType‘ ‚SinceImagePushed‘ ist, um die Bilder des Repositorys auf ihr Alter zu beschränken.

countUnit (Type: string, Required: yes, only if countType is set to sinceImagePushed):

Geben Sie die Einheit für das Alter nur dann an, wenn ‚countType‘ ‚SinceImagePushed‘ ist; andernfalls tritt ein Fehler auf.

countNumber (Type: integer, Required: yes):

Nur positive ganze Zahlen (0 ist kein akzeptierter Wert). Wenn ‚countType‘ ‚imageCountMoreThan‘ ist, ist der Wert die maximale Anzahl der aufzubewahrenden Bilder. Die Verwendung von ‚SinceImagePushed‘ als ‚countType‘ bestimmt das maximale Image-Alter.

 type (Type: string, Required: yes):

Wählen Sie die Aktion aus. Der verwendbare Wert ist ‚expire‘.

Hier ist ein Beispiel für eine ‚policy.json‘ Datei:

{
"rules": [
    {
      "rulePriority": 1,
      "description": "Expire images older than 10 days",
      "selection": {
        "tagStatus": "untagged",
        "countType": "sinceImagePushed",
        "countUnit": "days",
        "countNumber": 14
      },
      "action": {
        "type": "expire"
      }
    }
  ]
}

Passen Sie die Konfiguration an die Anforderungen Ihres Unternehmens an. „sinceImagePushed“ kann durch „imageCountMoreThan“ ersetzt werden.

Der Befehl zum Festlegen der Richtlinie lautet:

aws ecr put-lifecycle-policy --repository-name "test-ecr-polict" --lifecycle-policy-text "file://policy.json"

Methode 3: Der Scripting-Weg!

Wir verwenden die boto3-Bibliothek, um dies zu erreichen. Wir können dieselbe ‚policy.json‘ Datei verwenden. Hier ist ein Code-Snippet:

import boto3

client = boto3.client('ecr')

response = client.put_lifecycle_policy(
    registryId='PODES12342',
    repositoryName="test-ecr-policy",
    lifecyclePolicyText="plicy.json"
)

print(response)

Wie wendet man eine einzelne Richtlinie auf mehrere ECR-Repositories an?

Oftmals stellt sich die Frage, wie eine Richtlinie auf mehrere Repositories angewendet werden kann.

Das manuelle Festlegen von Richtlinien ist eine repetitive und zeitaufwändige Aufgabe.

Hier ist ein Codebeispiel, das in Produktionsumgebungen verwendet werden kann, um eine Richtlinie auf über 100 Repositories anzuwenden:

from boto3 import Session,client
from os import getenv
AWS_ACCESS_KEY_ID = getenv("ACCESSKEY")
AWS_SECRET_ACCESS_KEY = getenv("SECRETKEY")
session = Session(
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY
)
client = client('ecr')
response = client.describe_repositories()
repositories = response['repositories']
globalLifecyclePolicy = 'put your policy here’’
for repo in repositories:
    repoName = repo['repositoryName']
    client.put_lifecycle_policy( repositoryName = repoName,lifecyclePolicyText = globalLifecyclePolicy)

Fazit

Wir können problemlos ECR-Lebenszyklusrichtlinien erstellen und ältere Images gemäß den angegebenen Parametern automatisch löschen. AWS bietet umfassende Dokumentation und Beispiele für Lebenszyklusrichtlinien.

Sie können auch mit alternativen Richtlinien für getaggte Bilder experimentieren, z. B. durch den Abgleich von Kriterien mit dem Datum des Image-Uploads.

Zudem ist es empfehlenswert, weitere wichtige AWS-Terminologien zu erforschen, um Ihr Wissen weiter auszubauen.