Comment supprimer les images AWS ECR non balisées et plus anciennes ?

Publié: 2022-09-07

Amazon ECR est intégré à Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) et AWS Lambda, simplifiant ainsi votre workflow de développement vers la production.

Amazon ECR héberge les images dans une architecture hautement évolutive et disponible, ce qui vous permet de déployer des conteneurs de manière fiable pour vos applications. Il est important de supprimer les images non étiquetées et anciennes pour maintenir l'hygiène.

Aujourd'hui, les applications fonctionnent comme des micro-services. Le terme micro-service n'est rien d'autre qu'un conteneur qui regroupe tout le code et ses dépendances afin que l'application puisse s'exécuter rapidement et de manière fiable dans n'importe quel environnement informatique. En raison de leur portabilité, de leur petite taille et de leur commodité, les conteneurs deviennent une méthode de choix pour l'expédition d'applications modernes.

Les conteneurs sont conçus à partir d'un modèle en lecture seule appelé image. Ces images doivent être stockées quelque part afin qu'elles puissent être récupérées par n'importe quelle machine autorisée à les utiliser.

C'est là qu'un registre de conteneurs entre en jeu. Il n'y a pas si longtemps, les gens utilisaient DockerHub pour stocker ces images et artefacts. Mais, si vous utilisez les services cloud AWS, je suis sûr que vous utilisez déjà AWS ECR, qui est une alternative à DockerHub.

AWS ECR est un registre de conteneurs entièrement géré qui fournit un hébergement hautes performances, vous permettant de déployer des images d'application et des artefacts sous la forme de référentiels publics et privés.

Chaque jour, plusieurs applications hébergées par AWS poussent et extraient des millions d'images/artefacts d'application vers/hors de référentiels ECR spécifiques.

Dans cet article, nous verrons comment effacer les ECR AWS anciens et obsolètes et garder les référentiels ECR propres.

Le besoin : supprimez les images non taguées et anciennes maintenant !

La principale raison du nettoyage des référentiels ECR est l'hygiène du développement. À aucun moment, personne ne souhaiterait conserver des images datant de plus de dix déploiements dans ses ECR. C'est aussi parce que les retours en arrière se produisent fréquemment dans l'industrie, mais un retour en arrière qui annule le changement de 5 artefacts plus tôt est rare.

En termes plus simples, toute image/artefact datant de plus de cinq déploiements est inutile. Elle est susceptible d'être modifiée dans le rapport stratégique de votre organisation, mais nous ne la recommanderions pas en tant que meilleure pratique.

Dans l'ensemble de l'industrie, le balisage est utilisé pour spécifier les dernières images les plus stables ou les cinq dernières images les plus récentes. Dans le cadre du cycle de vie du développement logiciel, les images sont générées rapidement et ces balises sont remplacées par de nouvelles images, laissant les anciennes images sans balises et inutiles.

Dans des situations comme celle-ci, où les images/artefacts sont volumineux, cela ajoutera également des frais de stockage sur ECR. Le prix d'AWS ECR est de « 0,10 $ par Go / mois pour les données stockées dans des référentiels privés ou publics ».

Ce prix peut vous sembler petit, mais comme on dit, les gouttes constituent l'océan. Toutes ces images, si elles sont mises en magasin pour une période plus longue, ajouteront des factures plus élevées à vos factures AWS.

La suggestion est d'effacer ces images anciennes et non étiquetées de vos référentiels ECR car vous n'en avez pas besoin ! Simple! Pourquoi le garder et le payer ?

Suppression manuelle des images AWS ECR

Méthode 1 : La méthode GUI !

Étape 1 : Connectez-vous au compte Amazon Web Services et dirigez-vous vers le référentiel que vous souhaitez effacer.

Étape 2 : Ici, vous pouvez voir que le référentiel a la dernière balise pour spécifier la version la plus stable. Les autres balises que vous voyez peuvent être appelées non balisées. Pour supprimer, il suffit de sélectionner l'image et de cliquer sur supprimer.

Étape 3 : Confirmer pour supprimer

Méthode 2 : La méthode CLI !

Pour supprimer une image à l'aide de l'interface de ligne de commande, vous aurez besoin de toutes les clés d'accès AWS IAM configurées sur votre machine et de l'autorisation IAM requise pour vous donner accès aux référentiels.

Dans ce cas, nous l'avons déjà configuré. Vous pouvez le faire à partir du guide des bases de la configuration AWS si vous ne l'avez pas déjà fait.

Si vous n'êtes pas sûr d'avoir configuré l'AWS CLI sur votre machine, utilisez la commande suivante pour vérifier.

 aws sts get-caller-identity

Maintenant que nous avons confirmé que nous pouvons utiliser l'AWS CLI, vous pouvez utiliser la commande suivante pour supprimer une image ECR non balisée.

 aws ecr batch-delete-image --repository-name test-ecr-policy --image-ids imageTag=custom-image-6

Ici, nous faisons quelque chose de similaire à ce que nous avons fait dans l'interface graphique. Nous supprimerons l'image étiquetée comme custom-image-6 résidant dans le référentiel test-ecr-policy.

Méthode 3 : La méthode des scripts !

Le prérequis pour cette méthode est d'avoir une clé d'accès AWS configurée sur la machine sur laquelle vous exécutez.

Script pour supprimer les images non taguées.

 import boto3 client = boto3.client('ecr') response = client.list_images(repositoryName='test-ecr-policy') untaggedImageList = [image for image in response['imageIds'] if image['imageTag'] == 'custom-build-4'] response2 = client.batch_delete_image(repositoryName='aws-test-ecrpolicy', imageIds=untaggedImageList) print(response2)

La réponse vous donnerait la liste des ID d'image supprimés, ainsi qu'un échec s'il y en avait.

Méthode de planification pour supprimer des images ECR

Si vous êtes un ingénieur DevOps ou gérez régulièrement AWS ECR, vous connaissez déjà la difficulté de supprimer ces images manuellement.

L'exécution du script/de la commande facilite les choses, mais nous sommes sûrs que vous auriez souhaité quelque chose qui supprimerait automatiquement ces images sans que vous ayez à vous en soucier.

Bonne nouvelle, AWS ECR propose une politique de cycle de vie pour vos images, que vous pouvez définir pour supprimer ces images en temps opportun ou de manière planifiée. Voyons comment faire.

Méthode 1 : La méthode GUI !

Étape 1 : Accédez au référentiel dans lequel vous souhaitez définir la politique de cycle de vie. Sur le panneau de gauche, vous pouvez voir la politique de cycle de vie. Vous pouvez cliquer dessus pour commencer.

Étape 2 : Vous pouvez cliquer dessus et créer votre première règle.

Étape 3 : ECR vous permet de supprimer des images à deux conditions, l'une étant si vos images ont un certain nombre de jours ou si elles sont étiquetées/non étiquetées, et que vous souhaitez les conserver uniquement pendant, disons, X jours.

Voyons comment c'est fait. Vous pouvez désormais définir si vous souhaitez supprimer les images non étiquetées si elles datent d'un jour ou plus ou si le nombre d'images d'images non étiquetées dépasse un.

Choisissez en fonction de votre cas d'utilisation. N'oubliez pas; vous pouvez augmenter ces nombres jusqu'au nombre de votre choix. Enregistrez pour déclencher la règle de cycle de vie.

Méthode 2 : La méthode CLI !

La commande de l'AWS ECR CLI pour définir la politique de cycle de vie est put-lifecycle-policy.

Voyons comment faire. Pour cela, vous devez créer un fichier JSON listant les conditions de la politique. Vous pouvez le nommer policy.json ou n'importe quel nom de votre choix.

Mais avant cela, examinons les éléments de la politique de cycle de vie.

 rulePriority (Type: integer, Required: yes):

Ordre des règles du plus bas au plus élevé. Les règles de politique de cycle de vie avec la priorité 1 sont appliquées en premier, puis 2, etc. Les règles de politique de cycle de vie doivent chacune avoir une valeur de règle unique.

Les règles de stratégie n'ont pas besoin de valeurs consécutives. Toutes les règles balisées doivent avoir la priorité de règle la plus élevée et être examinées en dernier.

 description (Type: string, Required: no):

Explique à quoi sert une règle dans une politique de cycle de vie.

 tagStatus (Type: string, Required: yes):

Il vérifie si la règle de politique de cycle de vie ajoutée spécifie une balise d'image. Étiqueté, non étiqueté ou n'importe lequel est OK. Si aucun n'est spécifié, toutes les images sont évaluées. Tagged nécessite une valeur tagPrefixList. Untagged nécessite l'omission de tagPrefixList.

 tagPrefixList (Type: list[string], Required: yes, only if tagStatus is set to tagged):

Si "tagStatus" est "tagged", votre politique de cycle de vie nécessite une liste de préfixes de balises d'image séparés par des virgules.

En utilisant le préfixe de balise prod, vous pouvez spécifier toutes les images marquées prod, prod1, prod2, etc. Plusieurs balises sélectionnent uniquement les images avec toutes les balises.

 countType (Type: string, Required: yes):

Spécifiez countNumber si countType est imageCountMoreThan pour limiter le nombre d'images dans votre référentiel.

Spécifiez countUnit et countNumber si countType est sinceImagePushed pour limiter les images du référentiel.

 countUnit (Type: string, Required: yes, only if countType is set to sinceImagePushed):

Spécifiez uniquement une unité de comptage lorsque countType est sinceImagePushed ; sinon, une erreur se produit.

 countNumber (Type: integer, Required: yes):

Entiers positifs uniquement (0 n'est pas une valeur acceptée). Si countType est imageCountMoreThan, la valeur est le nombre maximum de photographies à conserver. L'utilisation de sinceImagePushed comme countType détermine l'âge maximal de l'image.

 type (Type: string, Required: yes):

Choisissez un type d'action. La valeur qui peut être utilisée est "expire".

Voici mon "policy.json".

 { "rules": [ { "rulePriority": 1, "description": "Expire images older than 10 days", "selection": { "tagStatus": "untagged", "countType": "sinceImagePushed", "countUnit": "days", "countNumber": 14 }, "action": { "type": "expire" } } ] }

Selon les exigences de votre organisation. "sinceImagePushed" peut être remplacé par "imageCountMoreThan".

La commande CLI pour définir cette stratégie serait :

 aws ecr put-lifecycle-policy --repository-name "test-ecr-polict" --lifecycle-policy-text "file://policy.json"

Méthode 3 : La méthode des scripts !

Nous utiliserons la commande boto3 pour y parvenir. Nous pouvons utiliser le même "policy.json" pour configurer cela. Vous trouverez ci-dessous l'extrait de code utilisé.

 import boto3 client = boto3.client('ecr') response = client.put_lifecycle_policy( registryId='PODES12342', repositoryName='test-ecr-policy', lifecyclePolicyText='plicy.json' ) print(response)

Comment appliquer une politique unique sur plusieurs référentiels ECR ?

Souvent, il y a des questions sur la façon d'appliquer la même politique sur plusieurs référentiels.

C'est une tâche répétitive et ennuyeuse de définir des politiques manuellement.

Voici un extrait de code qui peut être utilisé dans le système de production pour appliquer une politique sur plus de 100 référentiels.

 from boto3 import Session,client from os import getenv AWS_ACCESS_KEY_ID = getenv("ACCESSKEY") AWS_SECRET_ACCESS_KEY = getenv("SECRETKEY") session = Session( aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY ) client = client('ecr') response = client.describe_repositories() repositories = response['repositories'] globalLifecyclePolicy = 'put your policy here'' for repo in repositories: repoName = repo['repositoryName'] client.put_lifecycle_policy( repositoryName = repoName,lifecyclePolicyText = globalLifecyclePolicy)

Conclusion

Nous pouvons facilement construire une politique de cycle de vie ECR et détruire les anciennes images en fonction des paramètres spécifiés. AWS fournit une documentation complète ainsi que des exemples de politiques de cycle de vie.

Vous pouvez également expérimenter d'autres politiques pour les images étiquetées, telles que la correspondance des critères avec la date à laquelle l'image a été téléchargée.

Vous pouvez également explorer certaines terminologies clés AWS qui font progresser votre apprentissage AWS.