Automatizzare la Pulizia delle Immagini ECR con Bash

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:
- Elencare Tutti i Repository ECR:
Interroga AWS ECR per tutti i repository disponibili nel tuo account. - Recuperare Immagini e Tag:
Per ogni repository, elenca i dettagli delle immagini (inclusi digest e tag). - 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"). - 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.
- Dry Run (
- 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 con9.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 utilizzaset -euo pipefaildi 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 utilizzanoset -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 chejqsiano 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
- Testare Prima in un Ambiente di Staging:
Esegui sempre lo script in modalità--dry-runsu un ambiente di staging per verificare che identifichi correttamente le immagini target. - Implementare Backup:
Assicurati che le immagini siano sottoposte a backup o versionate appropriatamente se c'è il rischio di dover annullare eventuali modifiche. - 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. - Aggiornamenti Regolari:
Mantieni il tuo script revisionandolo e testandolo ogni volta che l'uso di ECR o la strategia di tagging delle immagini cambia. - 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.
Altro da Ercan
Altri due siti, stesso autore, terreno diverso.
IA, LLMs, agenti, ML applicato.
Note sul campo su workload IA. Analisi dei costi Bedrock, pattern di agenti, trade-off di storage vettoriale, failure mode in produzione.
Visita ercan.ai →L'hub. Chi sono, consulenza, contatti.
Hub personale per entrambe le tracce di scrittura. Chi sono, come funziona la consulenza, come contattarmi.
Visita ercanermis.com →