Η διαχείριση container images στο Amazon ECR (Elastic Container Registry) είναι κρίσιμη για να διατηρείς το registry σου καθαρό και οικονομικά αποδοτικό. Με την πάροδο του χρόνου, αχρησιμοποίητες ή deprecated εικόνες μπορούν να συσσωρευτούν, οδηγώντας δυνητικά σε αυξημένο κόστος αποθήκευσης και λειτουργικό overhead. Ένα συνηθισμένο σενάριο είναι η αφαίρεση εικόνων που ακολουθούν ένα συγκεκριμένο tagging pattern -- σε αυτή την περίπτωση, κάθε εικόνα με tags που ακολουθούν τη μορφή "9.x.x", όπου το x αντιπροσωπεύει ένα ή περισσότερα ψηφία.

Αυτό το άρθρο παρουσιάζει ένα Bash script σχεδιασμένο να αυτοματοποιεί τον καθαρισμό των ECR images. Το script παρέχει δύο κύριες λειτουργίες -- dry-run και apply -- επιτρέποντάς σου να προσομοιώσεις ή να εκτελέσεις διαγραφές ανάλογα με τις ανάγκες σου.


Επισκόπηση του Script

Το Bash script αξιοποιεί το AWS CLI και το jq (έναν ελαφρύ και ευέλικτο command-line JSON processor) για να:

  1. Καταγράψει Όλα τα ECR Repositories:
    Κάνει query στο AWS ECR για όλα τα διαθέσιμα repositories στον λογαριασμό σου.
  2. Ανακτήσει Images και Tags:
    Για κάθε repository, καταγράφει λεπτομέρειες εικόνων (συμπεριλαμβανομένων των image digests και tags).
  3. Εφαρμόσει Tag Filtering:
    Χρησιμοποιεί μια regular expression (^9\.[0-9]+\.[0-9]+$) για να βρει εικόνες των οποίων τα tags ταιριάζουν με τη μορφή "9.x.x" (π.χ. "9.0.1" ή "9.12.3").
  4. Λειτουργικούς Τρόπους:
    • Dry Run (--dry-run): Το script απλά καταγράφει τις εικόνες που θα διαγράφονταν, προσφέροντας την ευκαιρία να επαληθεύσεις ποιες εικόνες πληρούν τα κριτήρια διαγραφής χωρίς κανένα ρίσκο.
    • Apply (--apply): Προχωρά και διαγράφει τις εντοπισμένες εικόνες από τα repositories.
  5. Πληροφορίες Χρήσης:
    Αν το script εκτελεστεί χωρίς έγκυρο όρισμα, εμφανίζει ένα βοηθητικό μήνυμα χρήσης που εξηγεί τις διαθέσιμες επιλογές.

Βασικά Χαρακτηριστικά

1. Αυτόματη Ανακάλυψη Repositories

  • Τι Κάνει:
    Το script ανακτά δυναμικά όλα τα διαθέσιμα ECR repositories αντί να απαιτεί χειροκίνητη εισαγωγή ή hardcoding ονομάτων repositories.
  • Πλεονέκτημα:
    Αυτό διασφαλίζει ότι το script παραμένει κλιμακούμενο και προσαρμόσιμο, διαχειριζόμενο αλλαγές στη λίστα repositories του λογαριασμού σου χωρίς επιπλέον ρύθμιση.

2. Ευέλικτο Tag Filtering με Regex

  • Τι Κάνει:
    Χρησιμοποιεί μια regular expression για να ταιριάξει version tags που ξεκινούν με 9. ακολουθούμενα από δύο ακόμα ομάδες ψηφίων χωρισμένες με τελεία.
  • Πλεονέκτημα:
    Η regex-based προσέγγιση παρέχει ακριβή έλεγχο για το ποιες εικόνες πρέπει να στοχευθούν. Επιτρέπει τη διατήρηση μιας naming convention και τον καθαρισμό εικόνων που ταιριάζουν με ένα συγκεκριμένο ξεπερασμένο ή deprecated versioning pattern.

3. Λειτουργία Διπλού Τρόπου (Dry-Run vs. Apply)

  • Τι Κάνει:
    Το script δέχεται command-line arguments για να προσομοιώσει τη διαγραφή (--dry-run) ή να την εκτελέσει πραγματικά (--apply).
  • Πλεονέκτημα:
    Αυτή η προσέγγιση διπλού τρόπου παρέχει ασφάλεια επιτρέποντάς σου να επαληθεύσεις τον αντίκτυπο πριν από οποιαδήποτε καταστροφική ενέργεια. Είναι ένα πολύτιμο χαρακτηριστικό για διαχειριστές που πρέπει να δοκιμάζουν scripts σε production-like περιβάλλοντα πρώτα.

4. Ισχυρός Χειρισμός Σφαλμάτων και Strict Mode

  • Τι Κάνει:
    Το script χρησιμοποιεί το set -euo pipefail του Bash για να επιβάλει αυστηρό έλεγχο σφαλμάτων. Αυτή η ρύθμιση κάνει το script να σταματά την εκτέλεση όταν συμβαίνουν σφάλματα, όταν γίνεται αναφορά σε μη ορισμένες μεταβλητές ή όταν οποιαδήποτε εντολή σε ένα pipeline αποτυγχάνει.
  • Πλεονέκτημα:
    Αυτό ελαχιστοποιεί τον κίνδυνο ατελών λειτουργιών ή απρόβλεπτης συμπεριφοράς του script, προάγοντας ένα πιο αξιόπιστο περιβάλλον εκτέλεσης.

5. Σαφής Τεκμηρίωση Χρήσης

  • Τι Κάνει:
    Αν παρέχεται λανθασμένο ή καθόλου όρισμα, εμφανίζει ένα μήνυμα βοήθειας με σαφείς οδηγίες χρήσης και περιγραφές κάθε λειτουργίας.
  • Πλεονέκτημα:
    Αυτό βοηθά στη μείωση των σφαλμάτων χρήστη και διευκρινίζει πώς να λειτουργήσει το script, καθιστώντας το πιο προσβάσιμο ακόμα και για λιγότερο έμπειρους χρήστες.

Πλεονεκτήματα και Μειονεκτήματα

Πλεονεκτήματα

  • Ασφάλεια και Προβλεψιμότητα:
    Η συμπερίληψη ενός dry-run mode βοηθά τους διαχειριστές να κάνουν preview των αλλαγών πριν δεσμευτούν στη διαγραφή, μειώνοντας τον κίνδυνο τυχαίας απώλειας δεδομένων.
  • Αυτόματη Ανακάλυψη:
    Η αυτόματη αναζήτηση όλων των repositories απλοποιεί τη διαχείριση και εξασφαλίζει ολοκληρωμένο καθαρισμό.
  • Regex-Based Filtering:
    Μια ισχυρή regular expression για tag filtering καθιστά εύκολη τη στόχευση συγκεκριμένων εικόνων με βάση version patterns.
  • Απλότητα και Επεκτασιμότητα:
    Γραμμένο σε Bash, το script είναι απλό στην κατανόηση και τροποποίηση. Η ευθύγραμμη δομή του το καθιστά προσβάσιμο για περαιτέρω προσαρμογή σε επιπλέον ανάγκες.
  • Ισχυρός Χειρισμός Σφαλμάτων:
    Οι μηχανισμοί χειρισμού σφαλμάτων του script (χρησιμοποιώντας set -euo pipefail) ενισχύουν την αξιοπιστία σταματώντας την εκτέλεση σε απροσδόκητα σφάλματα.

Μειονεκτήματα

  • Εξάρτηση από AWS CLI και jq:
    Το script απαιτεί τόσο το AWS CLI όσο και το jq να είναι εγκατεστημένα και ρυθμισμένα σωστά. Σε περιβάλλοντα όπου αυτά τα εργαλεία δεν είναι προεγκατεστημένα, απαιτείται επιπλέον ρύθμιση.
  • Περιορισμένη Ευελιξία Regex:
    Η τρέχουσα regex είναι ειδικά ρυθμισμένη για να ταιριάζει με εκδόσεις "9.x.x". Αν το versioning scheme σου αλλάξει, μπορεί να χρειαστεί να προσαρμόσεις τη regex αναλόγως, καθιστώντας το script λιγότερο ευέλικτο εκτός αν ενημερωθεί.
  • Πιθανότητα Υπερ-Διαγραφής:
    Αν μια εικόνα έχει multiple tags και ένα από αυτά ταιριάζει με τη regex, η εντολή διαγραφής θα ενεργήσει σε αυτή την εικόνα. Απαιτείται επιπλέον προσοχή κατά τη χρήση της λειτουργίας διαγραφής σε production περιβάλλον.
  • Κανένας Μηχανισμός Rollback:
    Μόλις μια εικόνα διαγραφεί (σε --apply mode), η ανάκτηση δεν είναι απλή. Οι διαχειριστές πρέπει να έχουν μέτρα backup ή version control σε περίπτωση που η διαγραφή ήταν τυχαία.
  • Αναλυτικό Logging:
    Το script εκτυπώνει μηνύματα για κάθε εικόνα που επεξεργάζεται, κάτι που μπορεί να είναι υπερβολικό σε περιβάλλοντα με μεγάλο αριθμό εικόνων. Αυτό θα μπορούσε δυνητικά να βελτιωθεί για μια πιο συνοπτική προσέγγιση logging.

Καλές Πρακτικές και Συστάσεις

  1. Δοκίμασε σε Staging Environment Πρώτα:
    Πάντα να τρέχεις το script σε --dry-run mode σε ένα staging environment για να επαληθεύσεις ότι εντοπίζει σωστά τις εικόνες-στόχους.
  2. Εφάρμοσε Backups:
    Διασφάλισε ότι οι εικόνες έχουν backup ή versioning κατάλληλα αν υπάρχει κίνδυνος να χρειαστεί rollback.
  3. Παρακολούθησε τα Logs:
    Αν σκοπεύεις να τρέχεις αυτό το script περιοδικά (π.χ. μέσω cron), σκέψου να ανακατευθύνεις τα output logs σε ένα αρχείο και να εφαρμόσεις log rotation.
  4. Τακτικές Ενημερώσεις:
    Συντήρησε το script σου αναθεωρώντας και δοκιμάζοντάς το όποτε αλλάζει η χρήση του ECR ή η στρατηγική image tagging σου.
  5. Ρύθμισε τη Regex Όταν Χρειάζεται:
    Προσάρμοσε το regex pattern αν το versioning system σου εξελιχθεί ή αν εισάγεις νέες tagging conventions.

Το Script

#!/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.”

Συμπέρασμα

Το παρεχόμενο Bash script προσφέρει μια ισχυρή και πρακτική λύση για την αυτοματοποίηση του καθαρισμού Amazon ECR images που ταιριάζουν με ένα καθορισμένο tag pattern. Με τον σαφή διαχωρισμό μεταξύ προσομοίωσης (dry-run) και εκτέλεσης (apply), μαζί με την αυτόματη ανακάλυψη repositories και τους μηχανισμούς χειρισμού σφαλμάτων, το script είναι ένα ισχυρό εργαλείο για τη διαχείριση container images.

Ωστόσο, οι διαχειριστές πρέπει επίσης να γνωρίζουν τις εξαρτήσεις του και να προσαρμόζουν προσεκτικά το regex filter ώστε να ευθυγραμμίζεται με το συγκεκριμένο versioning scheme τους. Ακολουθώντας καλές πρακτικές, όπως η δοκιμή σε staging environment και η παρακολούθηση των deletion logs, το script μπορεί να βελτιστοποιήσει σημαντικά τη συντήρηση του ECR, να μειώσει το storage bloat και να βελτιώσει τη συνολική λειτουργική αποδοτικότητα.