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 hochgradig skalierbaren und verfügbaren Architektur, die Ihnen dies ermöglicht Container bereitstellen zuverlässig für Ihre Anwendungen. Es ist wichtig, ungetaggte und alte Bilder zu löschen, um die Hygiene aufrechtzuerhalten.

Heute laufen Anwendungen als Mikrodienst. 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 verwenden AWS-Cloud Dienste 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 der Lebenszyklus der Softwareentwicklung, werden die Bilder schnell generiert, und diese Tags werden durch neue Bilder ersetzt, wodurch die älteren Bilder unmarkiert und nutzlos bleiben.

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?

Deleting AWS ECR Images Manually

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: Zum Löschen bestätigen

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 es von der tun Leitfaden zu AWS-Konfigurationsgrundlagen wenn du es nicht schon getan hast.

Wenn Sie sich nicht sicher sind, ob Sie konfiguriert haben AWS-CLI Verwenden Sie auf Ihrem Computer 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.

Scheduling Method to Delete ECR Images

If you are a DevOps Wenn Sie AWS ECR entwickeln oder regelmäßig verwalten, kennen Sie bereits die Mühen, diese Bilder manuell zu löschen.

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: Wechseln Sie zu dem Repository, in dem Sie die Lebenszyklusrichtlinie 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: Mit ECR können Sie Bilder unter zwei Bedingungen löschen, eine davon ist, wenn Ihre Bilder bestimmte Tage alt werden oder wenn sie getaggt/nicht getaggt 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-Lebenszyklus-Richtlinie.

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 2 werden zuerst angewendet, dann XNUMX 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.

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. „seitImagePushed“ Kann ersetzt werden mit „imageCountMoreThan“.

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 erkunden AWS-Schlüsselterminologien die Ihr AWS Learning voranbringen.