Die Verwaltung von Container-Images in Amazon ECR (Elastic Container Registry) ist entscheidend, um deine Registry sauber und kosteneffizient zu halten. Mit der Zeit konnen sich ungenutzte oder veraltete Images ansammeln, was potenziell zu erhohten Speicherkosten und betrieblichem Overhead fuhrt. Ein haufiges Szenario ist das Entfernen von Images, die einem bestimmten Tagging-Muster folgen -- in diesem Fall alle Images, die mit Versionen im Format "9.x.x" getaggt sind, wobei x fur eine oder mehrere Ziffern steht.

Dieser Artikel stellt ein Bash-Skript vor, das die Bereinigung von ECR-Images automatisiert. Das Skript bietet zwei Hauptmodi -- Dry-Run und Apply -- mit denen du Loschungen je nach Bedarf simulieren oder ausfuhren kannst.


Skript-Ubersicht

Das Bash-Skript nutzt die AWS CLI und jq (einen leichtgewichtigen und flexiblen Kommandozeilen-JSON-Prozessor) um:

  1. Alle ECR-Repositories auflisten:
    Es fragt AWS ECR nach allen verfugbaren Repositories in deinem Konto ab.
  2. Images und Tags abrufen:
    Fur jedes Repository listet es Image-Details auf (einschliesslich Image-Digests und Tags).
  3. Tag-Filterung anwenden:
    Es verwendet einen regularen Ausdruck (^9\.[0-9]+\.[0-9]+$), um Images zu finden, deren Tags dem Format "9.x.x" entsprechen (z.B. "9.0.1" oder "9.12.3").
  4. Betriebsmodi:
    • Dry Run (--dry-run): Das Skript listet nur die Images auf, die geloscht wurden, und bietet die Moglichkeit zu uberprufen, welche Images zur Loschung qualifiziert sind, ohne Risiko.
    • Apply (--apply): Es fuhrt die Loschung der identifizierten Images aus den Repositories durch.
  5. Nutzungsinformationen:
    Wenn das Skript ohne gultiges Argument ausgefuhrt wird, gibt es eine hilfreiche Nutzungsmeldung aus, die die verfugbaren Optionen erklart.

Hauptfunktionen

1. Automatische Repository-Erkennung

  • Was es tut:
    Das Skript ruft dynamisch alle verfugbaren ECR-Repositories ab, anstatt manuelle Eingaben oder hartcodierte Repository-Namen zu erfordern.
  • Vorteil:
    Dies stellt sicher, dass das Skript skalierbar und anpassungsfahig bleibt und Anderungen in der Repository-Liste deines Kontos ohne zusatzliche Konfiguration bewaltigt.

2. Flexible Tag-Filterung mit Regex

  • Was es tut:
    Verwendet einen regularen Ausdruck, um Versions-Tags zu finden, die mit 9. beginnen, gefolgt von zwei weiteren Zifferngruppen, getrennt durch einen Punkt.
  • Vorteil:
    Der Regex-basierte Ansatz bietet prazise Kontrolle daruber, welche Images ins Visier genommen werden sollen. Er ermoglicht die Einhaltung einer Namenskonvention und die Bereinigung von Images, die einem bestimmten veralteten Versionierungsschema entsprechen.

3. Dual-Mode-Betrieb (Dry-Run vs. Apply)

  • Was es tut:
    Das Skript akzeptiert Kommandozeilenargumente, um entweder die Loschung zu simulieren (--dry-run) oder tatsachlich auszufuhren (--apply).
  • Vorteil:
    Dieser Dual-Mode-Ansatz bietet Sicherheit, indem du die Auswirkungen uberprufen kannst, bevor du destruktive Aktionen durchfuhrst. Es ist eine wertvolle Funktion fur Administratoren, die Skripte zuerst in produktionsahnlichen Umgebungen testen mussen.

4. Robuste Fehlerbehandlung und Strict Mode

  • Was es tut:
    Das Skript verwendet Bashs set -euo pipefail, um strikte Fehlerprufung durchzusetzen. Diese Einstellung fuhrt dazu, dass das Skript die Ausfuhrung stoppt, wenn Fehler auftreten, wenn auf nicht gesetzte Variablen verwiesen wird oder wenn ein Befehl in einer Pipeline fehlschlagt.
  • Vorteil:
    Dies minimiert das Risiko unvollstandiger Operationen oder unvorhersehbaren Skriptverhaltens und fordert eine zuverlassigere Ausfuhrungsumgebung.

5. Klare Nutzungsdokumentation

  • Was es tut:
    Wenn ein falsches oder kein Argument angegeben wird, gibt es eine Hilfemeldung mit klaren Nutzungsanweisungen und Beschreibungen jedes Modus aus.
  • Vorteil:
    Dies hilft, Benutzerfehler zu reduzieren und klart die Bedienung des Skripts, was es auch fur weniger erfahrene Benutzer zuganglicher macht.

Vor- und Nachteile

Vorteile

  • Sicherheit und Vorhersagbarkeit:
    Die Einbeziehung eines Dry-Run-Modus hilft Administratoren, Anderungen vor der Loschung zu prufen und reduziert das Risiko versehentlichen Datenverlusts.
  • Automatisierte Erkennung:
    Die automatische Abfrage aller Repositories vereinfacht die Administration und gewahrleistet eine umfassende Bereinigung.
  • Regex-basierte Filterung:
    Ein robuster regularer Ausdruck fur die Tag-Filterung macht es einfach, bestimmte Images basierend auf Versionsmustern zu identifizieren.
  • Einfachheit und Erweiterbarkeit:
    In Bash geschrieben, ist das Skript sowohl einfach zu verstehen als auch zu modifizieren. Seine unkomplizierte Struktur macht es zuganglich fur weitere Anpassungen an zusatzliche Anforderungen.
  • Robuste Fehlerbehandlung:
    Die Fehlerbehandlungsmechanismen des Skripts (mit set -euo pipefail) erhohen die Zuverlassigkeit, indem sie die Ausfuhrung bei unerwarteten Fehlern anhalten.

Nachteile

  • Abhangigkeit von AWS CLI und jq:
    Das Skript erfordert, dass sowohl die AWS CLI als auch jq installiert und korrekt konfiguriert sind. In Umgebungen, in denen diese Tools nicht vorinstalliert sind, ist zusatzliche Einrichtung erforderlich.
  • Begrenzte Regex-Flexibilitat:
    Der aktuelle Regex ist speziell auf "9.x.x"-Versionen abgestimmt. Wenn sich dein Versionierungsschema andert, musst du den Regex moglicherweise entsprechend anpassen, was das Skript ohne Aktualisierung weniger flexibel macht.
  • Potenzial fur Uber-Loschung:
    Wenn ein Image mit mehreren Werten getaggt ist und einer davon dem Regex entspricht, fuhrt der Loschbefehl die Aktion auf diesem Image aus. Besondere Vorsicht ist bei der Verwendung des Loschmodus in einer Produktionsumgebung geboten.
  • Kein Rollback-Mechanismus:
    Sobald ein Image geloscht ist (im --apply-Modus), ist die Wiederherstellung nicht einfach. Administratoren mussen Backup- oder Versionskontrollmassnahmen bereithalten, falls die Loschung versehentlich erfolgte.
  • Ausfuhrliches Logging:
    Das Skript gibt Meldungen fur jedes verarbeitete Image aus, was in Umgebungen mit einer grossen Anzahl von Images uberwaltigend sein kann. Dies konnte potenziell fur einen pragnanteren Logging-Ansatz verfeinert werden.

Bewahrte Methoden und Empfehlungen

  1. Zuerst in einer Staging-Umgebung testen:
    Fuhre das Skript immer im --dry-run-Modus in einer Staging-Umgebung aus, um zu uberprufen, ob es die Ziel-Images korrekt identifiziert.
  2. Backups implementieren:
    Stelle sicher, dass Images gesichert oder angemessen versioniert sind, falls das Risiko besteht, Anderungen ruckgangig machen zu mussen.
  3. Logs uberwachen:
    Wenn du vorhast, dieses Skript periodisch auszufuhren (z.B. via Cron), erwahge die Umleitung der Ausgabelogs in eine Datei und die Implementierung von Log-Rotation.
  4. Regelmassige Aktualisierungen:
    Pflege dein Skript, indem du es uberprufst und testest, wann immer sich deine ECR-Nutzung oder Image-Tagging-Strategie andert.
  5. Regex bei Bedarf anpassen:
    Passe das Regex-Muster an, wenn sich dein Versionierungssystem weiterentwickelt oder wenn du neue Tagging-Konventionen einfuhrst.

Das Skript

#!/bin/bash
# This script processes all ECR repositories and their images, checks for image tags matching the pattern "9.x.x"
# (where x represents one or more digits), and then either lists (dry run) or deletes (apply) those images.
#
# Usage:
#   ./cleanup_ecr.sh --dry-run    # Lists images that would be deleted without performing deletion.
#   ./cleanup_ecr.sh --apply      # Deletes images with tags matching "9.x.x".
#   ./cleanup_ecr.sh              # Displays this help message.

set -euo pipefail

function usage() { echo “Usage: $0 [–dry-run | –apply]” echo "" echo " –dry-run List images that match the tag pattern ‘9.x.x’ without deleting them." echo " –apply Delete images that match the tag pattern ‘9.x.x’." }

Check command-line arguments

if [ “$#” -ne 1 ]; then usage exit 1 fi

MODE="$1" if [[ “$MODE” != “–dry-run” && “$MODE” != “–apply” ]]; then usage exit 1 fi

Define regex pattern for tags: “9.” followed by digit(s) a dot then digit(s)

REGEX="^9.[0-9]+.[0-9]+$"

echo “Mode: $MODE” echo “Fetching list of ECR repositories…”

Retrieve all repository names.

repositories=$(aws ecr describe-repositories –query ‘repositories[].repositoryName’ –output text)

Check if any repositories were returned.

if [ -z “$repositories” ]; then echo “No ECR repositories found.” exit 0 fi

Process each repository.

for repo in $repositories; do echo “——————————” echo “Processing repository: $repo”

# Retrieve image details: digest and tags.
images_json=$(aws ecr describe-images \
    --repository-name "$repo" \
    --query 'imageDetails[*].{Digest: imageDigest, Tags: imageTags}' \
    --output json)

# Determine the number of images in this repository.
image_count=$(echo "$images_json" | jq 'length')
if [ "$image_count" -eq 0 ]; then
    echo "  No images found in repository $repo."
    continue
fi

# Iterate over each image.
for (( i=0; i<image_count; i++ )); do
    image_digest=$(echo "$images_json" | jq -r ".[$i].Digest")
    # Extract tags; some images might have no tags.
    tags=$(echo "$images_json" | jq -r ".[$i].Tags[]" 2>/dev/null || true)

    if [ -z "$tags" ]; then
        continue
    fi
    
    # Loop through each tag.
    for tag in $tags; do
        if [[ $tag =~ $REGEX ]]; then
            echo "Match found - Repo: '$repo', Digest: '$image_digest', Tag: '$tag'"
            if [ "$MODE" == "--apply" ]; then
                echo "  Deleting image..."
                aws ecr batch-delete-image \
                    --repository-name "$repo" \
                    --image-ids imageDigest="$image_digest",imageTag="$tag"
            fi
        else
            echo "Skipping - Repo: '$repo', Digest: '$image_digest', Tag: '$tag'"
        fi
    done
done

done

echo “Process completed.”

Fazit

Das bereitgestellte Bash-Skript bietet eine robuste und praktische Losung zur Automatisierung der Bereinigung von Amazon ECR-Images, die einem bestimmten Tag-Muster entsprechen. Mit seiner klaren Trennung zwischen Simulation (Dry-Run) und Ausfuhrung (Apply), zusammen mit der automatischen Repository-Erkennung und den Fehlerbehandlungsmechanismen, ist das Skript ein leistungsfahiges Werkzeug fur das Container-Image-Management.

Administratoren mussen sich jedoch auch seiner Abhangigkeiten bewusst sein und den Regex-Filter sorgfaltig an ihr spezifisches Versionierungsschema anpassen. Durch die Befolgung bewahrter Methoden, wie das Testen in einer Staging-Umgebung und die Uberwachung von Loschlogs, kann das Skript die ECR-Wartung erheblich optimieren, Speicher-Blae reduzieren und die allgemeine Betriebseffizienz verbessern.