Gestire le immagini container in Amazon ECR (Elastic Container Registry) è cruciale per mantenere il tuo registry pulito ed economicamente efficiente. Nel tempo, immagini inutilizzate o deprecate possono accumularsi, portando potenzialmente a un aumento dei costi di storage e overhead operativo. Uno scenario comune è la rimozione di immagini che seguono un pattern di tagging specifico, in questo caso, qualsiasi immagine taggata con versioni che seguono il formato "9.x.x", dove x rappresenta una o più cifre.

Questo articolo presenta uno script Bash progettato per automatizzare la pulizia delle immagini ECR. Lo script fornisce due modalità principali, dry-run e apply, permettendoti di simulare o eseguire le eliminazioni in base alle tue esigenze.


Panoramica dello Script

Lo script Bash sfrutta la AWS CLI e jq (un processore JSON da riga di comando leggero e flessibile) per:

  1. Elencare Tutti i Repository ECR:
    Interroga AWS ECR per tutti i repository disponibili nel tuo account.
  2. Recuperare Immagini e Tag:
    Per ogni repository, elenca i dettagli delle immagini (inclusi digest e tag).
  3. Applicare il Filtraggio dei Tag:
    Utilizza un'espressione regolare (^9\.[0-9]+\.[0-9]+$) per trovare immagini i cui tag corrispondono al formato "9.x.x" (es. "9.0.1" o "9.12.3").
  4. Modalità Operative:
    • Dry Run (--dry-run): Lo script elenca solo le immagini che verrebbero eliminate, offrendo l'opportunità di verificare quali immagini sono candidate all'eliminazione senza alcun rischio.
    • Apply (--apply): Procede con l'eliminazione delle immagini identificate dai repository.
  5. Informazioni sull'Uso:
    Se lo script viene eseguito senza un argomento valido, produce un messaggio di aiuto che spiega le opzioni disponibili.

Caratteristiche Principali

1. Scoperta Automatica dei Repository

  • Cosa Fa:
    Lo script recupera dinamicamente tutti i repository ECR disponibili invece di richiedere input manuali o nomi di repository cablati.
  • Vantaggio:
    Questo garantisce che lo script rimanga scalabile e adattabile, gestendo i cambiamenti nell'elenco dei repository senza configurazioni aggiuntive.

2. Filtraggio Flessibile dei Tag con Regex

  • Cosa Fa:
    Utilizza un'espressione regolare per trovare tag di versione che iniziano con 9. seguiti da altri due gruppi di cifre separati da un punto.
  • Vantaggio:
    L'approccio basato su regex fornisce un controllo preciso su quali immagini devono essere targettizzate. Permette di mantenere una convenzione di denominazione e pulire le immagini che rientrano in uno schema di versionamento obsoleto o deprecato.

3. Funzionamento a Doppia Modalità (Dry-Run vs. Apply)

  • Cosa Fa:
    Lo script accetta argomenti da riga di comando per simulare l'eliminazione (--dry-run) o eseguirla effettivamente (--apply).
  • Vantaggio:
    Questo approccio a doppia modalità offre sicurezza permettendoti di verificare l'impatto prima di eseguire azioni distruttive. È una funzionalità preziosa per gli amministratori che devono testare gli script prima in ambienti simili alla produzione.

4. Gestione Robusta degli Errori e Strict Mode

  • Cosa Fa:
    Lo script utilizza set -euo pipefail di Bash per applicare un controllo rigoroso degli errori. Questa impostazione interrompe l'esecuzione in caso di errori, quando si fa riferimento a variabili non impostate o quando qualsiasi comando in una pipeline fallisce.
  • Vantaggio:
    Questo minimizza il rischio di operazioni incomplete o comportamenti imprevedibili dello script, promuovendo un ambiente di esecuzione più affidabile.

5. Documentazione Chiara sull'Uso

  • Cosa Fa:
    Se viene fornito un argomento errato o nessun argomento, stampa un messaggio di aiuto con chiare istruzioni sull'uso e descrizioni di ciascuna modalità.
  • Vantaggio:
    Questo aiuta a ridurre gli errori dell'utente e chiarisce come utilizzare lo script, rendendolo più accessibile anche per utenti meno esperti.

Pro e Contro

Pro

  • Sicurezza e Prevedibilità:
    L'inclusione di una modalità dry-run aiuta gli amministratori a visualizzare in anteprima le modifiche prima di impegnarsi nell'eliminazione, riducendo il rischio di perdita accidentale di dati.
  • Scoperta Automatica:
    L'interrogazione automatica di tutti i repository semplifica l'amministrazione e garantisce una pulizia completa.
  • Filtraggio Basato su Regex:
    Un'espressione regolare robusta per il filtraggio dei tag rende facile targettizzare immagini specifiche in base a pattern di versione.
  • Semplicità ed Estendibilità:
    Scritto in Bash, lo script è sia semplice da comprendere che da modificare. La sua struttura lineare lo rende accessibile per ulteriori personalizzazioni.
  • Gestione Robusta degli Errori:
    I meccanismi di gestione degli errori dello script (che utilizzano set -euo pipefail) migliorano l'affidabilità interrompendo l'esecuzione in caso di errori imprevisti.

Contro

  • Dipendenza da AWS CLI e jq:
    Lo script richiede che sia la AWS CLI che jq siano installati e configurati correttamente. In ambienti dove questi strumenti non sono preinstallati, è necessaria una configurazione aggiuntiva.
  • Flessibilità Limitata della Regex:
    La regex attuale è specificamente calibrata per trovare versioni "9.x.x". Se il tuo schema di versionamento cambia, potresti dover adattare la regex di conseguenza, rendendo lo script meno flessibile se non aggiornato.
  • Potenziale di Sovra-Eliminazione:
    Se un'immagine è taggata con più valori e uno di essi corrisponde alla regex, il comando di eliminazione agirà su quell'immagine. È necessaria particolare cautela quando si utilizza la modalità di eliminazione in un ambiente di produzione.
  • Nessun Meccanismo di Rollback:
    Una volta eliminata un'immagine (in modalità --apply), il recupero non è semplice. Gli amministratori devono avere misure di backup o controllo versione in atto nel caso di eliminazione accidentale.
  • Logging Verboso:
    Lo script stampa messaggi per ogni immagine elaborata, il che potrebbe essere eccessivo in ambienti con un gran numero di immagini. Questo potrebbe essere perfezionato per un approccio di logging più conciso.

Buone Pratiche e Raccomandazioni

  1. Testare Prima in un Ambiente di Staging:
    Esegui sempre lo script in modalità --dry-run su un ambiente di staging per verificare che identifichi correttamente le immagini target.
  2. Implementare Backup:
    Assicurati che le immagini siano sottoposte a backup o versionate appropriatamente se c'è il rischio di dover annullare eventuali modifiche.
  3. Monitorare i Log:
    Se intendi eseguire questo script periodicamente (es. via cron), considera di reindirizzare i log di output su un file e implementare la rotazione dei log.
  4. Aggiornamenti Regolari:
    Mantieni il tuo script revisionandolo e testandolo ogni volta che l'uso di ECR o la strategia di tagging delle immagini cambia.
  5. Perfezionare la Regex Quando Necessario:
    Adatta il pattern regex se il tuo sistema di versionamento evolve o se introduci nuove convenzioni di tagging.

Lo Script

#!/bin/bash
# Questo script elabora tutti i repository ECR e le loro immagini, controlla i tag delle immagini
# che corrispondono al pattern "9.x.x" (dove x rappresenta una o più cifre),
# e poi elenca (dry run) o elimina (apply) quelle immagini.
#
# Utilizzo:
#   ./cleanup_ecr.sh --dry-run    # Elenca le immagini che verrebbero eliminate senza eseguire l'eliminazione.
#   ./cleanup_ecr.sh --apply      # Elimina le immagini con tag che corrispondono a "9.x.x".
#   ./cleanup_ecr.sh              # Mostra questo messaggio di aiuto.

set -euo pipefail

function usage() { echo “Utilizzo: $0 [–dry-run | –apply]” echo "" echo " –dry-run Elenca le immagini che corrispondono al pattern di tag ‘9.x.x’ senza eliminarle." echo " –apply Elimina le immagini che corrispondono al pattern di tag ‘9.x.x’." }

Controlla gli argomenti della riga di comando

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

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

Definisce il pattern regex per i tag: “9.” seguito da cifra/e, un punto, poi cifra/e

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

echo “Modalità: $MODE” echo “Recupero elenco dei repository ECR…”

Recupera tutti i nomi dei repository.

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

Verifica se sono stati restituiti repository.

if [ -z “$repositories” ]; then echo “Nessun repository ECR trovato.” exit 0 fi

Elabora ogni repository.

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

# Recupera i dettagli delle immagini: digest e tag.
images_json=$(aws ecr describe-images \
    --repository-name "$repo" \
    --query 'imageDetails[*].{Digest: imageDigest, Tags: imageTags}' \
    --output json)

# Determina il numero di immagini in questo repository.
image_count=$(echo "$images_json" | jq 'length')
if [ "$image_count" -eq 0 ]; then
    echo "  Nessuna immagine trovata nel repository $repo."
    continue
fi

# Itera su ogni immagine.
for (( i=0; i<image_count; i++ )); do
    image_digest=$(echo "$images_json" | jq -r ".[$i].Digest")
    # Estrae i tag; alcune immagini potrebbero non avere tag.
    tags=$(echo "$images_json" | jq -r ".[$i].Tags[]" 2>/dev/null || true)

    if [ -z "$tags" ]; then
        continue
    fi
    
    # Cicla attraverso ogni tag.
    for tag in $tags; do
        if [[ $tag =~ $REGEX ]]; then
            echo "Corrispondenza trovata - Repo: '$repo', Digest: '$image_digest', Tag: '$tag'"
            if [ "$MODE" == "--apply" ]; then
                echo "  Eliminazione immagine..."
                aws ecr batch-delete-image \
                    --repository-name "$repo" \
                    --image-ids imageDigest="$image_digest",imageTag="$tag"
            fi
        else
            echo "Saltato - Repo: '$repo', Digest: '$image_digest', Tag: '$tag'"
        fi
    done
done

done

echo “Processo completato.”

Conclusione

Lo script Bash fornito offre una soluzione robusta e pratica per automatizzare la pulizia delle immagini Amazon ECR che corrispondono a un pattern di tag specificato. Con la sua chiara separazione tra modalità di simulazione (dry-run) ed esecuzione (apply), insieme alla scoperta automatica dei repository e ai meccanismi di gestione degli errori, lo script è uno strumento potente per la gestione delle immagini container.

Tuttavia, gli amministratori devono anche essere consapevoli delle sue dipendenze e calibrare attentamente il filtro regex per allinearlo al proprio schema di versionamento specifico. Seguendo le buone pratiche, come testare in un ambiente di staging e monitorare i log di eliminazione, lo script può semplificare significativamente la manutenzione di ECR, ridurre l'accumulo di storage e migliorare l'efficienza operativa complessiva.