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

Amazon ECR ist in Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) und AWS Lambda integriert, wodurch Ihr Workflow von der Entwicklung bis zur Produktion vereinfacht wird.

Amazon ECR hostet die Images in einer hochskalierbaren und verfügbaren Architektur, sodass Sie Container zuverlässig für Ihre Anwendungen bereitstellen können. Es ist wichtig, ungetaggte und alte Bilder zu löschen, um die Hygiene aufrechtzuerhalten.

Anwendungen laufen heute als Microservice. Der Begriff Microservice ist nichts anderes als ein Container, der den gesamten Code und seine Abhängigkeiten verpackt, damit die Anwendung in jeder Computerumgebung schnell und zuverlässig ausgeführt werden kann. Aufgrund ihrer Tragbarkeit, geringen Größe und Bequemlichkeit werden Container zu einer Methode der Wahl für den Versand moderner Anwendungen.

Container werden anhand einer schreibgeschützten Vorlage namens Image entworfen. Diese Bilder müssen irgendwo gespeichert werden, damit sie von jedem Computer abgerufen werden können, der berechtigt ist, sie zu verwenden.

Hier kommt eine Containerregistrierung ins Spiel. Vor nicht allzu langer Zeit verwendeten die Leute DockerHub, um diese Bilder und Artefakte zu speichern. Aber wenn Sie AWS-Cloud-Services verwenden, bin ich sicher, dass Sie bereits AWS ECR verwenden, das eine Alternative zu DockerHub darstellt.

AWS ECR ist eine vollständig verwaltete Containerregistrierung, die Hochleistungs-Hosting bietet und es Ihnen ermöglicht, Anwendungs-Images und Artefakte in Form von öffentlichen und privaten Repositories bereitzustellen.

Jeden Tag verschieben und ziehen mehrere von AWS gehostete Anwendungen Millionen von Bildern/Anwendungsartefakten in/aus bestimmten ECR-Repositories.

In diesem Artikel werden wir erörtern, wie alte und veraltete AWS ECR gelöscht und ECR-Repositories sauber gehalten werden.

Die Notwendigkeit: Löschen Sie jetzt ungetaggte und alte Bilder!

Der Hauptgrund für die Reinigung von ECR-Repositories ist die Entwicklungshygiene. Zu keinem Zeitpunkt möchte jemand Images, die älter als zehn Bereitstellungen sind, in seinen ECRs aufbewahren. Dies liegt auch daran, dass Rollbacks in der Branche häufig vorkommen, aber ein Rollback, der die Änderung von 5 früheren Artefakten rückgängig macht, ist selten.

Einfacher ausgedrückt sind alle Bilder/Artefakte, die älter als fünf Bereitstellungen sind, nutzlos. Der Strategiebericht Ihrer Organisation kann sich ändern, wir würden ihn jedoch nicht als Best Practice empfehlen.

In der gesamten Branche wird Tagging verwendet, um die stabilsten neuesten oder die letzten fünf neuesten Bilder anzugeben. Als Teil des Lebenszyklus der Softwareentwicklung werden die Bilder schnell generiert, und diese Tags werden durch neue Bilder ersetzt, wodurch die älteren Bilder unmarkiert und nutzlos bleiben.

  So verwenden Sie Ihr iPad als externes Mac-Display mit Sidecar

In Situationen wie dieser, in denen Bilder/Artefakte groß sind, werden auch Speichergebühren für ECR hinzugefügt. Die Preise für AWS ECR betragen „0,10 $ pro GB/Monat für Daten, die in privaten oder öffentlichen Repositories gespeichert sind“.

Dieser Preis mag Ihnen gering erscheinen, aber wie heißt es so schön: Tropfen machen den Ozean aus. All diese Bilder werden, wenn sie für einen längeren Zeitraum gespeichert werden, höhere Rechnungen zu Ihren AWS-Rechnungen hinzufügen.

Der Vorschlag ist, diese alten und ungetaggten Bilder aus Ihren ECR-Repositories zu löschen, da Sie sie nicht benötigen! Einfach! Warum es behalten und dafür bezahlen?

Manuelles Löschen von AWS ECR-Images

Methode 1: Der GUI-Weg!

Schritt 1: Melden Sie sich beim Amazon Web Services-Konto an und gehen Sie zu dem Repository, das Sie löschen möchten.

Schritt 2: Hier können Sie sehen, dass das Repository das neueste Tag hat, um die stabilste Version anzugeben. Die anderen Tags, die Sie sehen, können als ungetaggt bezeichnet werden. Zum Löschen müssen wir nur das Bild auswählen und auf Löschen klicken.

Schritt 3: Bestätigen Sie das Löschen

Methode 2: Der CLI-Weg!

Um ein Image mit der CLI zu löschen, benötigen Sie alle AWS IAM-Zugriffsschlüssel, die auf Ihrem Computer konfiguriert sind, und die erforderliche IAM-Berechtigung, um Ihnen Zugriff auf die Repositorys zu gewähren.

In diesem Fall haben wir es bereits konfiguriert. Sie können dies anhand des Leitfadens zu den AWS-Konfigurationsgrundlagen tun, falls Sie dies noch nicht getan haben.

Wenn Sie sich nicht sicher sind, ob Sie AWS CLI auf Ihrem Computer konfiguriert haben, verwenden Sie den folgenden Befehl zur Überprüfung.

aws sts get-caller-identity

Nachdem wir nun bestätigt haben, dass wir die AWS CLI verwenden können, können Sie den folgenden Befehl verwenden, um ein ECR-Image ohne Tags zu löschen.

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

Hier machen wir etwas Ähnliches wie in der GUI. Wir werden das als custom-image-6 gekennzeichnete Image löschen, das sich im Repository test-ecr-policy befindet.

Methode 3: Der Scripting-Weg!

Voraussetzung für diese Methode ist, dass auf dem Computer, auf dem Sie ausgeführt werden, ein AWS-Zugriffsschlüssel konfiguriert ist.

Skript zum Löschen von Bildern ohne Tags.

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 würde Ihnen die Liste der gelöschten Bild-IDs geben, zusammen mit einem Fehler, falls vorhanden.

Planungsmethode zum Löschen von ECR-Bildern

Wenn Sie ein DevOps-Ingenieur sind oder AWS ECR regelmäßig verwalten, kennen Sie bereits die Probleme beim manuellen Löschen dieser Images.

  35 beste Web-Apps und Tipps von 2016

Das Ausführen des Skripts/Befehls macht die Sache zwar einfacher, aber wir sind sicher, Sie hätten sich etwas gewünscht, das diese Bilder automatisch von selbst löscht, ohne dass Sie sich darum kümmern müssen.

Gute Nachrichten, AWS ECR bietet eine Lebenszyklusrichtlinie für Ihre Bilder, die Sie so einstellen können, dass diese Bilder rechtzeitig oder nach Zeitplan gelöscht werden. Mal sehen, wie es geht.

Methode 1: Der GUI-Weg!

Schritt 1: Gehen Sie zu dem Repository, in dem Sie die Lifecycle-Richtlinie festlegen möchten. Auf der linken Seite sehen Sie die Lebenszyklusrichtlinie. Sie können darauf klicken, um loszulegen.

Schritt 2: Sie können darauf klicken und Ihre erste Regel erstellen.

Schritt 3: ECR ermöglicht es Ihnen, Bilder unter zwei Bedingungen zu löschen, eine davon ist, wenn Ihre Bilder bestimmte Tage alt werden oder wenn sie markiert/nicht markiert sind und Sie sie beispielsweise nur für eine Anzahl von X Tagen aufbewahren möchten.

Mal sehen, wie es gemacht wird. Jetzt können Sie einstellen, ob Sie Bilder ohne Tags löschen möchten, wenn sie einen Tag oder älter sind oder wenn die Anzahl der Bilder ohne Tags eins überschreitet.

Wählen Sie entsprechend Ihrem Anwendungsfall. Vergiss nicht; Sie können diese Zahlen auf die Zahl Ihrer Wahl erhöhen. Speichern Sie, um die Lebenszyklusregel auszulösen.

Methode 2: Der CLI-Weg!

Der AWS ECR CLI-Befehl zum Festlegen der Lebenszyklusrichtlinie lautet put-lifecycle-policy.

Mal sehen, wie es geht. Dazu müssen Sie eine JSON-Datei erstellen, in der die Richtlinienbedingungen aufgeführt sind. Sie können es policy.json oder einen beliebigen Namen Ihrer Wahl nennen.

Aber vorher sehen wir uns die Elemente der Lebenszyklusrichtlinie an.

rulePriority (Type: integer, Required: yes):

Regelreihenfolge von niedriger nach höher. Lebenszyklus-Richtlinienregeln mit Priorität 1 werden zuerst angewendet, dann 2 usw. Lebenszyklus-Richtlinienregeln müssen jeweils einen eindeutigen Regelwert haben.

Richtlinienregeln benötigen keine aufeinanderfolgenden Werte. Regeln mit beliebigen Tags müssen die höchste Regelpriorität haben und zuletzt überprüft werden.

description (Type: string, Required: no):

Erläutert, wozu eine Regel in einer Lebenszyklusrichtlinie dient.

tagStatus (Type: string, Required: yes):

Es prüft, ob die hinzugefügte Lebenszyklus-Richtlinienregel ein Bild-Tag angibt. Getaggt, nicht getaggt oder beliebig ist OK. Wenn keine angegeben ist, werden alle Bilder ausgewertet. Tagged erfordert einen tagPrefixList-Wert. Untagged erfordert das Auslassen von tagPrefixList.

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

Wenn „tagStatus“ „tagged“ ist, erfordert Ihre Lebenszyklusrichtlinie eine durch Kommas getrennte Liste von Image-Tag-Präfixen.

  So fügen Sie einer einzelnen Instagram-Story mehrere Bilder hinzu

Mit dem Tag-Präfix prod können Sie alle Bilder angeben, die mit prod, prod1, prod2 usw. gekennzeichnet 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 einzuschränken.

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

Geben Sie nur dann eine Zähleinheit 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 Fotos. Die Verwendung von SinceImagePushed als countType bestimmt das maximale Image-Alter.

 type (Type: string, Required: yes):

Wählen Sie eine Aktionsart aus. Der verwendbare Wert ist „expire“.

Hier ist meine „policy.json“.

{

"rules": [

{

"rulePriority": 1,

"description": "Expire images older than 10 days",

"selection": {

"tagStatus": "untagged",

"countType": "sinceImagePushed",

"countUnit": "days",

"countNumber": 14

},

"action": {

"type": "expire"

}

}

]

}

Gemäß den Anforderungen Ihrer Organisation. „sinceImagePushed“ kann durch „imageCountMoreThan“ ersetzt werden.

Der CLI-Befehl zum Festlegen dieser Richtlinie lautet:

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

Methode 3: Der Scripting-Weg!

Wir werden den boto3-Befehl verwenden, um dies zu erreichen. Wir können dieselbe „policy.json“ verwenden, um dies einzurichten. Unten ist das verwendete 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 einzige Richtlinie auf mehrere ECR-Repositories an?

Oft gibt es Fragen dazu, wie dieselbe Richtlinie auf mehrere Repositories angewendet werden kann.

Es ist eine sich wiederholende und langweilige Aufgabe, Richtlinien manuell festzulegen.

Hier ist ein Codeausschnitt, der im Produktionssystem verwendet werden kann, um eine Richtlinie auf über 100 Repositorys 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 eine ECR-Lebenszyklusrichtlinie erstellen und ältere Images gemäß den angegebenen Parametern vernichten. AWS bietet umfangreiche Dokumentation sowie Beispiele für Lebenszyklusrichtlinien.

Sie können auch mit alternativen Richtlinien für markierte Bilder experimentieren, z. B. das Abgleichen von Kriterien mit dem Datum, an dem das Bild hochgeladen wurde.

Sie können auch einige wichtige AWS-Terminologien erkunden, die Ihr AWS-Lernen voranbringen.