Gerer les images de conteneurs dans Amazon ECR (Elastic Container Registry) est crucial pour garder votre registre propre et economique. Avec le temps, les images inutilisees ou depreciees peuvent s'accumuler, entrainant potentiellement une augmentation des couts de stockage et une charge operationnelle supplementaire. Un scenario courant est la suppression des images qui suivent un format de tag specifique -- dans ce cas, toute image taggee avec des versions suivant le format "9.x.x", ou x represente un ou plusieurs chiffres.

Cet article presente un script Bash concu pour automatiser le nettoyage des images ECR. Le script propose deux modes principaux : dry-run et apply, vous permettant de simuler ou d'executer les suppressions selon vos besoins.


Apercu du Script

Le script Bash exploite l'AWS CLI et jq (un processeur JSON en ligne de commande leger et flexible) pour :

  1. Lister Tous les Depots ECR :
    Il interroge AWS ECR pour tous les depots disponibles dans votre compte.
  2. Recuperer les Images et Tags :
    Pour chaque depot, il liste les details des images (y compris les digests et les tags).
  3. Appliquer le Filtrage par Tag :
    Il utilise une expression reguliere (^9\.[0-9]+\.[0-9]+$) pour trouver les images dont les tags correspondent au format "9.x.x" (par exemple, "9.0.1" ou "9.12.3").
  4. Modes Operationnels :
    • Dry Run (--dry-run) : Le script liste uniquement les images qui seraient supprimees, offrant la possibilite de verifier quelles images sont concernees sans aucun risque.
    • Apply (--apply) : Il procede a la suppression des images identifiees dans les depots.
  5. Informations d'Utilisation :
    Si le script est execute sans argument valide, il affiche un message d'aide expliquant les options disponibles.

Fonctionnalites Cles

1. Decouverte Automatique des Depots

  • Ce que ca fait :
    Le script recupere dynamiquement tous les depots ECR disponibles plutot que de necessiter une saisie manuelle ou des noms de depots en dur.
  • Avantage :
    Cela garantit que le script reste scalable et adaptable, gerant les changements dans la liste des depots de votre compte sans configuration supplementaire.

2. Filtrage Flexible par Tag avec Regex

  • Ce que ca fait :
    Utilise une expression reguliere pour faire correspondre les tags de version qui commencent par 9. suivi de deux autres groupes de chiffres separes par un point.
  • Avantage :
    L'approche basee sur les regex fournit un controle precis sur les images a cibler. Elle permet de maintenir une convention de nommage et de nettoyer les images qui correspondent a un schema de versionnage obselete ou deprecie.

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

  • Ce que ca fait :
    Le script accepte des arguments en ligne de commande pour simuler la suppression (--dry-run) ou l'executer reellement (--apply).
  • Avantage :
    Cette approche dual-mode offre de la securite en vous permettant de verifier l'impact avant d'effectuer des actions destructrices. C'est une fonctionnalite precieuse pour les administrateurs qui ont besoin de tester les scripts d'abord dans des environnements proches de la production.

4. Gestion Robuste des Erreurs et Mode Strict

  • Ce que ca fait :
    Le script utilise set -euo pipefail de Bash pour appliquer une verification stricte des erreurs. Ce parametrage fait que le script s'arrete en cas d'erreur, de reference a des variables non definies ou d'echec d'une commande dans un pipeline.
  • Avantage :
    Cela minimise le risque d'operations incompletes ou de comportement imprevisible du script, favorisant un environnement d'execution plus fiable.

5. Documentation d'Utilisation Claire

  • Ce que ca fait :
    Si un argument incorrect ou aucun argument n'est fourni, il affiche un message d'aide avec des instructions d'utilisation claires et des descriptions de chaque mode.
  • Avantage :
    Cela aide a reduire les erreurs utilisateur et clarifie comment utiliser le script, le rendant plus accessible meme pour les utilisateurs moins experimentes.

Avantages et Inconvenients

Avantages

  • Securite et Predictibilite :
    L'inclusion du mode dry-run aide les administrateurs a previsualiser les changements avant de s'engager dans la suppression, reduisant le risque de perte de donnees accidentelle.
  • Decouverte Automatisee :
    L'interrogation automatique de tous les depots simplifie l'administration et assure un nettoyage complet.
  • Filtrage Base sur les Regex :
    Une expression reguliere robuste pour le filtrage des tags facilite le ciblage d'images specifiques en fonction des motifs de version.
  • Simplicite et Extensibilite :
    Ecrit en Bash, le script est a la fois simple a comprendre et a modifier. Sa structure directe le rend accessible pour des personnalisations ulterieures.
  • Gestion Robuste des Erreurs :
    Les mecanismes de gestion des erreurs du script (utilisant set -euo pipefail) ameliorent la fiabilite en arretant l'execution sur les erreurs inattendues.

Inconvenients

  • Dependance a AWS CLI et jq :
    Le script necessite que l'AWS CLI et jq soient installes et configures correctement. Dans les environnements ou ces outils ne sont pas preinstalles, une configuration supplementaire est necessaire.
  • Flexibilite Regex Limitee :
    Le regex actuel est specifiquement ajuste pour correspondre aux versions "9.x.x". Si votre schema de versionnage change, vous devrez peut-etre ajuster le regex en consequence.
  • Potentiel de Sur-Suppression :
    Si une image est taggee avec plusieurs valeurs et que l'une d'elles correspond au regex, la commande de suppression agira sur cette image. Une prudence supplementaire est necessaire lors de l'utilisation du mode suppression en production.
  • Pas de Mecanisme de Rollback :
    Une fois une image supprimee (en mode --apply), la recuperation n'est pas simple. Les administrateurs doivent avoir des mesures de sauvegarde ou de controle de version en place.
  • Logging Verbeux :
    Le script affiche des messages pour chaque image traitee, ce qui peut etre ecrasant dans les environnements avec un grand nombre d'images.

Bonnes Pratiques et Recommandations

  1. Tester d'abord dans un Environnement de Staging :
    Executez toujours le script en mode --dry-run sur un environnement de staging pour verifier qu'il identifie correctement les images cibles.
  2. Mettre en Place des Sauvegardes :
    Assurez-vous que les images sont sauvegardees ou versionnees de maniere appropriee s'il y a un risque de devoir annuler des modifications.
  3. Surveiller les Logs :
    Si vous prevoyez d'executer ce script periodiquement (par exemple, via cron), envisagez de rediriger les logs de sortie vers un fichier et d'implementer une rotation des logs.
  4. Mises a Jour Regulieres :
    Maintenez votre script en le revisant et en le testant chaque fois que votre utilisation d'ECR ou votre strategie de tagging d'images change.
  5. Ajuster le Regex si Necessaire :
    Ajustez le motif regex si votre systeme de versionnage evolue ou si vous introduisez de nouvelles conventions de tagging.

Le Script

#!/bin/bash
# Ce script traite tous les depots ECR et leurs images, verifie les tags d'image correspondant au motif "9.x.x"
# (ou x represente un ou plusieurs chiffres), puis liste (dry run) ou supprime (apply) ces images.
#
# Usage:
#   ./cleanup_ecr.sh --dry-run    # Liste les images qui seraient supprimees sans effectuer la suppression.
#   ./cleanup_ecr.sh --apply      # Supprime les images avec des tags correspondant a "9.x.x".
#   ./cleanup_ecr.sh              # Affiche ce message d'aide.

set -euo pipefail

function usage() { echo “Usage: $0 [–dry-run | –apply]” echo "" echo " –dry-run Liste les images qui correspondent au motif de tag ‘9.x.x’ sans les supprimer." echo " –apply Supprime les images qui correspondent au motif de tag ‘9.x.x’." }

Verifier les arguments de ligne de commande

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

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

Definir le motif regex pour les tags : “9.” suivi de chiffre(s), un point, puis chiffre(s)

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

echo “Mode: $MODE” echo “Recuperation de la liste des depots ECR…”

Recuperer tous les noms de depots.

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

Verifier si des depots ont ete retournes.

if [ -z “$repositories” ]; then echo “Aucun depot ECR trouve.” exit 0 fi

Traiter chaque depot.

for repo in $repositories; do echo “——————————” echo “Traitement du depot: $repo”

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

# Determiner le nombre d'images dans ce depot.
image_count=$(echo "$images_json" | jq 'length')
if [ "$image_count" -eq 0 ]; then
    echo "  Aucune image trouvee dans le depot $repo."
    continue
fi

# Iterer sur chaque image.
for (( i=0; i<image_count; i++ )); do
    image_digest=$(echo "$images_json" | jq -r ".[$i].Digest")
    # Extraire les tags ; certaines images peuvent ne pas avoir de tags.
    tags=$(echo "$images_json" | jq -r ".[$i].Tags[]" 2>/dev/null || true)

    if [ -z "$tags" ]; then
        continue
    fi
    
    # Boucler a travers chaque tag.
    for tag in $tags; do
        if [[ $tag =~ $REGEX ]]; then
            echo "Correspondance trouvee - Depot: '$repo', Digest: '$image_digest', Tag: '$tag'"
            if [ "$MODE" == "--apply" ]; then
                echo "  Suppression de l'image..."
                aws ecr batch-delete-image \
                    --repository-name "$repo" \
                    --image-ids imageDigest="$image_digest",imageTag="$tag"
            fi
        else
            echo "Ignore - Depot: '$repo', Digest: '$image_digest', Tag: '$tag'"
        fi
    done
done

done

echo “Processus termine.”

Conclusion

Le script Bash propose offre une solution robuste et pratique pour automatiser le nettoyage des images Amazon ECR qui correspondent a un motif de tag specifique. Avec sa separation claire entre la simulation (dry-run) et l'execution (apply), ainsi que sa decouverte automatique des depots et ses mecanismes de gestion des erreurs, le script est un outil puissant pour la gestion des images de conteneurs.

Cependant, les administrateurs doivent egalement etre conscients de ses dependances et adapter soigneusement le filtre regex a leur schema de versionnage specifique. En suivant les bonnes pratiques, comme le test dans un environnement de staging et la surveillance des logs de suppression, le script peut considerablement rationaliser la maintenance ECR, reduire le surstockage et ameliorer l'efficacite operationnelle globale.