Come eliminare le immagini AWS ECR senza tag e meno recenti?

Amazon ECR è integrato con Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) e AWS Lambda, semplificando il flusso di lavoro dallo sviluppo alla produzione.

Amazon ECR ospita le immagini in un’architettura altamente scalabile e disponibile, consentendoti di distribuire i container in modo affidabile per le tue applicazioni. È importante eliminare le immagini senza tag e vecchie per mantenere l’igiene.

Oggi le applicazioni vengono eseguite come microservizi. Il termine microservizio non è altro che un contenitore che racchiude tutto il codice e le sue dipendenze in modo che l’applicazione possa essere eseguita in modo rapido e affidabile in qualsiasi ambiente informatico. Grazie alla loro portabilità, dimensioni ridotte e praticità, i container stanno diventando un metodo di scelta per la spedizione di applicazioni moderne.

I contenitori sono progettati da un modello di sola lettura chiamato immagine. Queste immagini devono essere archiviate da qualche parte in modo che possano essere recuperate da qualsiasi macchina autorizzata a usarle.

È qui che entra in gioco un registro dei contenitori. Non molto tempo fa, la gente usava DockerHub per archiviare queste immagini e questi artefatti. Tuttavia, se stai utilizzando i servizi cloud AWS, sono sicuro che stai già utilizzando AWS ECR, che è un’alternativa a DockerHub.

AWS ECR è un registro di container completamente gestito che fornisce hosting ad alte prestazioni, consentendoti di distribuire immagini di applicazioni e artefatti sotto forma di repository pubblici e privati.

Ogni giorno, più applicazioni ospitate in AWS spingono ed estraggono milioni di immagini/artefatti di applicazioni dentro/fuori da specifici repository ECR.

In questo articolo, discuteremo come cancellare AWS ECR vecchio e obsoleto e mantenere puliti i repository ECR.

La necessità: elimina ora le immagini senza tag e vecchie!

Il motivo principale per pulire i repository ECR è l’igiene dello sviluppo. In nessun momento, nessuno vorrebbe mantenere le immagini più vecchie di dieci distribuzioni nei propri ECR. È anche perché i rollback si verificano frequentemente nel settore, ma un rollback che ripristina la modifica da 5 artefatti precedenti è raro.

In termini più semplici, qualsiasi immagine/artefatto più vecchio di cinque distribuzioni è inutile. È soggetto a modifiche nel report strategico della tua organizzazione, ma non lo consigliamo come best practice.

In tutto il settore, il tagging viene utilizzato per specificare l’ultima immagine più stabile o le ultime cinque ultime immagini. Come parte del ciclo di vita dello sviluppo del software, le immagini vengono generate rapidamente e questi tag vengono sostituiti con nuove immagini, lasciando le vecchie immagini senza tag e inutili.

In situazioni come questa, in cui le immagini/gli artefatti sono di grandi dimensioni, verranno aggiunti anche costi di archiviazione sull’ECR. Il prezzo di AWS ECR è “$ 0,10 per GB / mese per i dati archiviati in repository privati ​​o pubblici”.

Questo prezzo potrebbe sembrare piccolo per te, ma come si suol dire, le gocce formano l’oceano. Tutte queste immagini, se messe in negozio per un periodo più lungo, aggiungeranno fatture più elevate alle tue fatture AWS.

Il suggerimento è di cancellare queste immagini vecchie e senza tag dai tuoi repository ECR perché non ne hai bisogno! Semplice! Perché tenerlo e pagarlo?

Eliminazione manuale delle immagini AWS ECR

Metodo 1: la via della GUI!

Passaggio 1: accedi all’account Amazon Web Services e vai al repository che desideri cancellare.

Passaggio 2: qui puoi vedere che il repository ha l’ultimo tag per specificare la versione più stabile. Gli altri tag che vedi possono essere chiamati senza tag. Per eliminare, dobbiamo solo selezionare l’immagine e fare clic su Elimina.

Passaggio 3: conferma per eliminare

Metodo 2: il modo CLI!

Per eliminare un’immagine utilizzando la CLI, avrai bisogno di tutte le chiavi di accesso AWS IAM configurate sulla tua macchina e dell’autorizzazione IAM richiesta per darti accesso ai repository.

In questo caso, l’abbiamo già configurato. Puoi farlo dalla guida alle nozioni di base sulla configurazione di AWS se non l’hai già fatto.

Se non sei sicuro di aver configurato AWS CLI sulla tua macchina, utilizza il comando seguente per verificare.

aws sts get-caller-identity

Ora che abbiamo confermato che possiamo utilizzare l’AWS CLI, puoi utilizzare il comando seguente per eliminare un’immagine ECR senza tag.

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

Qui stiamo facendo qualcosa di simile a quello che abbiamo fatto nella GUI. Elimineremo l’immagine contrassegnata come custom-image-6 che risiede nel repository test-ecr-policy.

Metodo 3: il modo di scripting!

Il prerequisito per questo metodo è avere una chiave AWS Access configurata nella macchina su cui stai eseguendo.

Script per eliminare le immagini senza tag.

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 risposta ti darebbe l’elenco degli ID immagine eliminati, insieme a un errore se ce ne fossero.

Metodo di pianificazione per eliminare le immagini ECR

Se sei un ingegnere DevOps o gestisci regolarmente AWS ECR, conoscerai già i problemi dell’eliminazione manuale di queste immagini.

L’esecuzione dello script/comando rende le cose più facili, ma siamo sicuri che avresti desiderato qualcosa che eliminasse automaticamente queste immagini da sole senza doversi preoccupare di loro.

Buone notizie, AWS ECR offre una policy del ciclo di vita per le tue immagini, che puoi impostare per eliminare queste immagini in modo tempestivo o pianificato. Vediamo come farlo.

Metodo 1: la via della GUI!

Passaggio 1: vai al repository in cui desideri impostare la politica del ciclo di vita. Nel pannello di sinistra, puoi vedere la politica del ciclo di vita. Puoi fare clic su di esso per iniziare.

Passaggio 2: puoi fare clic su di esso e creare la tua prima regola.

Passaggio 3: ECR ti consente di eliminare le immagini a due condizioni, una è se le tue immagini hanno alcuni giorni specificati o se sono contrassegnate/non contrassegnate e desideri conservarle solo per, ad esempio, X numero di giorni.

Vediamo come si fa. Ora puoi impostare se desideri eliminare le immagini senza tag se sono più vecchie di un giorno o se il conteggio delle immagini senza tag supera uno.

Scegli in base al tuo caso d’uso. Non dimenticare; puoi aumentare questi numeri fino al numero che preferisci. Salva per attivare la regola del ciclo di vita.

Metodo 2: il modo CLI!

Il comando AWS ECR CLI per impostare la policy del ciclo di vita è put-lifecycle-policy.

Vediamo come farlo. Per questo, devi creare un file JSON che elenca le condizioni della politica. Puoi nominarlo policy.json o qualsiasi nome a tua scelta.

Ma prima, diamo un’occhiata agli elementi della politica del ciclo di vita.

rulePriority (Type: integer, Required: yes):

Ordine delle regole dal basso verso l’alto. Le regole dei criteri del ciclo di vita con priorità uno vengono applicate per prime, poi 2 e così via. Ciascuna delle regole dei criteri del ciclo di vita deve avere un valore di regola univoco.

Le regole dei criteri non necessitano di valori consecutivi. Le regole contrassegnate da qualsiasi tag devono avere la priorità più alta ed essere riviste per ultime.

description (Type: string, Required: no):

Spiega a cosa serve una regola in una policy del ciclo di vita.

tagStatus (Type: string, Required: yes):

Verifica se la regola della politica del ciclo di vita aggiunta specifica un tag immagine. Contrassegnato, non contrassegnato o qualsiasi è OK. Se non ne viene specificato nessuno, tutte le immagini vengono valutate. Tagged richiede un valore tagPrefixList. Untagged richiede l’omissione di tagPrefixList.

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

Se “tagStatus” è “taggato”, la policy del ciclo di vita richiede un elenco di prefissi di tag immagine separati da virgole.

Usando il prefisso del tag prod, puoi specificare tutte le immagini contrassegnate come prod, prod1, prod2, ecc. Più tag selezionano solo le immagini con tutti i tag.

countType (Type: string, Required: yes):

Specifica countNumber se countType è imageCountMoreThan per limitare il numero di immagini nel tuo repository.

Specificare countUnit e countNumber se countType è sinceImagePushed per limitare le immagini del repository.

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

Specificare un’unità di conteggio solo quando countType è sinceImagePushed; in caso contrario, si verifica un errore.

countNumber (Type: integer, Required: yes):

Solo numeri interi positivi (0 non è un valore accettato). Se countType è imageCountMoreThan, il valore è il numero massimo di fotografie da conservare. L’utilizzo di sinceImagePushed come countType determina l’età massima dell’immagine.

 type (Type: string, Required: yes):

Scegli un tipo di azione. Il valore che può essere utilizzato è “scade”.

Ecco il mio “policy.json”.

{

"rules": [

{

"rulePriority": 1,

"description": "Expire images older than 10 days",

"selection": {

"tagStatus": "untagged",

"countType": "sinceImagePushed",

"countUnit": "days",

"countNumber": 14

},

"action": {

"type": "expire"

}

}

]

}

In base ai requisiti della tua organizzazione. “dal momento cheImagePushed” può essere sostituito con “imageCountMoreThan”.

Il comando CLI per impostare questa politica sarebbe:

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

Metodo 3: il modo di scripting!

Useremo il comando boto3 per raggiungere questo obiettivo. Possiamo usare lo stesso “policy.json” per configurarlo. Di seguito è riportato lo snippet di codice utilizzato.

import boto3

client = boto3.client('ecr')

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

print(response)

Come si applica una singola policy su più repository ECR?

Spesso ci sono domande su come applicare la stessa politica su più repository.

È un compito ripetitivo e noioso impostare manualmente le politiche.

Ecco uno snippet di codice che può essere utilizzato nel sistema di produzione per applicare una politica su oltre 100 repository.

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)

Conclusione

Possiamo facilmente costruire una politica del ciclo di vita ECR e distruggere le immagini più vecchie in base ai parametri specificati. AWS fornisce un’ampia documentazione nonché esempi di policy del ciclo di vita.

Puoi anche sperimentare criteri alternativi per le immagini contrassegnate, ad esempio criteri di corrispondenza con la data di caricamento dell’immagine.

Puoi anche esplorare alcune terminologie chiave di AWS che migliorano il tuo apprendimento AWS.