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

Amazon ECR ist integrated mit Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) und AWS Lambda, die Ihren Workflow von der Entwicklung bis zur Produktion vereinfachen.
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.
Containers are designed from a read-only template called an image. These images need to be stored somewhere so they can be retrieved by any machine authorized to use them.
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 is a fully managed container registry that provides high-performance hosting, allowing you to deploy application images and artifacts in the form of public and private Repositories.
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-Repositorys ist die Entwicklungshygiene. Niemand möchte zu irgendeinem Zeitpunkt Bilder, die älter als zehn Bereitstellungen sind, in seinen ECRs behalten. Das liegt auch daran, dass es in der Branche häufig zu Rollbacks kommt reverts, die Veränderung von 5 Artefakten früher ist selten.
In simpler terms, any image/artifacts more than five deployments old are useless. It is subject to change on your organization’s strategy report, but we wouldn’t recommend it as a best practice.
Across the industry, tagging is used to specify the most stable latest or last five latest images. As a part of the Lebenszyklus der Softwareentwicklung, the images are generated rapidly, and these tags are replaced with new images, leaving the older images untagged and useless.
In situations like this, where images/artifacts are large, it will also add storage charges on ECR. The pricing of AWS ECR is “$0.10 per GB / month for data stored in private or public repositories”.
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: Here, you can see that the repository has the latest tag to specify the most stable version. The other tags that you see can be called untagged. To delete, we just need to select the image and click delete.

Schritt 3: Zum Löschen bestätigen

Methode 2: Der CLI-Weg!
To delete an image using the CLI, you will need all AWS IAM access keys configured on your machine and the required IAM permission to give you access to the repositories.
In diesem Fall haben wir es bereits konfiguriert. Sie können es von der tun AWS configuration basics guide 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.
Planungsmethode zum Löschen von ECR-Bildern
If you are a DevOps engineer or regularly manage AWS ECR, you will already know the pains of deleting these images manually.
Running the script/command does make things easier, but we are sure you would have wished for something that would automatically delete these images on their own without you having to worry about them.
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: You can click on it and create your first rule.

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.
Let’s see how to do it. For this, you must create a JSON file listing the policy conditions. You can name it policy.json or any name of your choice.
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. Alle mit Tags versehenen Regeln müssen die höchste Regelpriorität haben und sein revZuletzt gesehen.
description (Type: string, Required: no):
Erläutert, wozu eine Regel in einer Lebenszyklusrichtlinie dient.
tagStatus (Type: string, Required: yes):
It checks if the added lifecycle policy rule specifies an image tag. Tagged, untagged, or any is OK. If none is specified, all images are evaluated. Tagged requires a tagPrefixList value. Untagged requires omitting tagPrefixList.
tagPrefixList (Type: list[string], Required: yes, only if tagStatus is set to tagged):
If “tagStatus” is “tagged,” your lifecycle policy requires a comma-separated list of image tag prefixes.
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):
Only specify a count unit when countType is sinceImagePushed; otherwise, an error occurs.
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.
It is a repetitive and boring task to set policies manually.
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)
Schlussfolgerung
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.
You can also experiment with alternative policies for tagged images, such as matching criteria with the date the image was uploaded.
Sie können auch einige erkunden AWS-Schlüsselterminologien die Ihr AWS Learning voranbringen.