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

Gestione delle Immagini in Amazon ECR: Pulizia e Ottimizzazione

Amazon ECR si integra perfettamente con servizi come Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) e AWS Lambda, facilitando il percorso dallo sviluppo alla messa in produzione. Questo rende il flusso di lavoro più efficiente e senza intoppi.

Amazon ECR offre un’architettura altamente scalabile e disponibile per l’hosting delle immagini, garantendo un’affidabile distribuzione dei container per le tue applicazioni. Una pratica essenziale è l’eliminazione periodica di immagini non taggate e obsolete, mantenendo così un ambiente pulito ed efficiente.

Le applicazioni moderne spesso si basano su microservizi, essenzialmente container che incapsulano il codice e le sue dipendenze. Questa struttura permette un’esecuzione rapida e affidabile in qualsiasi ambiente. La portabilità, le dimensioni ridotte e la praticità dei container li rendono una soluzione privilegiata per la distribuzione di applicazioni moderne.

I container sono creati a partire da un modello di sola lettura, noto come immagine. Queste immagini devono essere memorizzate in un registro da cui possono essere recuperate da macchine autorizzate. Un registro di container diventa quindi uno strumento indispensabile in questo contesto.

In passato, DockerHub era una soluzione comune per l’archiviazione di queste immagini. Tuttavia, se utilizzi servizi cloud AWS, è probabile che tu stia già sfruttando AWS ECR, un’alternativa a DockerHub che si integra perfettamente nell’ecosistema AWS.

AWS ECR è un registro di container completamente gestito, progettato per offrire hosting ad alte prestazioni. Consente di distribuire immagini di applicazioni e artefatti tramite repository pubblici e privati, offrendo grande flessibilità e controllo.

Ogni giorno, un numero sempre maggiore di applicazioni ospitate su AWS inviano e recuperano milioni di immagini e artefatti dai repository ECR. Questa elevata attività sottolinea l’importanza di una gestione efficiente di queste risorse.

Questo articolo esplorerà come eliminare immagini obsolete e non necessarie da AWS ECR, mantenendo i repository puliti e ottimizzati.

La Necessità: Rimuovere Immagini Non Tagged e Obsolete

La pulizia dei repository ECR è fondamentale per una sana gestione dello sviluppo. Nessuno desidera conservare immagini più vecchie di dieci versioni nei propri ECR. I rollback sono una pratica comune, ma raramente è necessario ripristinare modifiche da più di cinque versioni precedenti.

In pratica, qualsiasi immagine o artefatto che abbia più di cinque versioni di età è generalmente considerata superflua. Sebbene questo criterio possa essere modificato in base alle politiche aziendali, cinque versioni sono un buon punto di partenza come pratica consigliata.

Il tagging è ampiamente utilizzato per identificare l’ultima immagine stabile o le ultime versioni. Durante il ciclo di sviluppo, nuove immagini vengono generate rapidamente, sostituendo i tag precedenti e lasciando le vecchie immagini non taggate e inutili.

Queste immagini, specialmente quelle di grandi dimensioni, occupano spazio di archiviazione su ECR, generando costi. AWS ECR addebita “$0.10 al GB/mese per i dati archiviati in repository privati o pubblici”. Anche se questo costo può sembrare modesto, l’accumulo di queste spese nel tempo può portare a costi significativi.

La soluzione più semplice è eliminare le immagini non taggate e obsolete dai repository ECR, in quanto non sono necessarie. Mantenere immagini inutilizzate significa solo sostenere costi inutili.

Eliminare Manualmente le Immagini AWS ECR

Metodo 1: Utilizzo dell’Interfaccia Grafica (GUI)

Passaggio 1: Accedi al tuo account Amazon Web Services e naviga verso il repository che desideri pulire.

Passaggio 2: Nel repository, individua le immagini. L’ultima immagine ha un tag che indica la versione più recente. Le immagini senza tag sono quelle che desideri eliminare. Per farlo, seleziona l’immagine e clicca su “Elimina”.

Passaggio 3: Conferma la cancellazione.

Metodo 2: Utilizzo della CLI (Interfaccia a Riga di Comando)

Per eliminare un’immagine tramite CLI, assicurati di avere le credenziali AWS IAM configurate e i permessi necessari per accedere ai repository.

Se non sei sicuro di aver configurato correttamente AWS CLI, usa il seguente comando per verificarlo:

aws sts get-caller-identity

Una volta confermata la corretta configurazione di AWS CLI, puoi usare il seguente comando per eliminare un’immagine ECR non taggata:

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

In questo esempio, il comando elimina l’immagine con il tag ‘custom-image-6’ dal repository ‘test-ecr-policy’.

Metodo 3: Utilizzo di uno Script

Anche per questo metodo, è necessario che le credenziali AWS siano configurate sulla macchina dove verrà eseguito lo script.

Ecco un esempio di script per eliminare immagini non taggate:

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 dello script fornisce un elenco degli ID immagine eliminati e segnala eventuali errori.

Pianificare l’Eliminazione Automatica delle Immagini ECR

Per chi lavora regolarmente con AWS ECR, l’eliminazione manuale delle immagini può diventare un’operazione ripetitiva. L’uso di script o comandi semplifica il processo, ma l’ideale sarebbe un sistema che elimini automaticamente le immagini senza necessità di intervento.

Fortunatamente, AWS ECR offre le policy del ciclo di vita, che permettono di eliminare le immagini in base a regole e pianificazioni prestabilite. Esaminiamo come impostare queste policy.

Metodo 1: Configurazione della Policy del Ciclo di Vita tramite GUI

Passaggio 1: Accedi al repository in cui desideri impostare la policy del ciclo di vita. Nel menu di sinistra, seleziona “Politiche del ciclo di vita”.

Passaggio 2: Crea una nuova regola.

Passaggio 3: ECR consente di eliminare le immagini in base all’età (in giorni) o allo stato del tag. Ad esempio, puoi eliminare le immagini senza tag se hanno superato un certo numero di giorni o se il numero di immagini senza tag supera una soglia.

Configura la regola in base alle tue esigenze. Ad esempio, puoi eliminare le immagini non taggate che hanno più di un giorno o se ce n’è più di una. Salva per attivare la regola.

Metodo 2: Configurazione della Policy del Ciclo di Vita tramite CLI

Il comando AWS ECR CLI per impostare la policy del ciclo di vita è ‘put-lifecycle-policy’. Per usarlo, crea un file JSON che definisca le condizioni della policy (es. ‘policy.json’).

Ecco gli elementi di una policy del ciclo di vita:

rulePriority Ordine di esecuzione delle regole. Le regole con priorità bassa vengono eseguite prima. Ogni regola deve avere una priorità unica.
description Descrizione della regola.
tagStatus Specifica se la regola si applica a immagini tagged, untagged o a tutte.
tagPrefixList Elenco di prefissi di tag (necessario solo se tagStatus è “tagged”).
countType Specifica se la policy si basa sul numero di immagini o sulla loro età.
countUnit Unità di misura per l’età delle immagini (giorni, mesi, etc.). Necessario se countType è ‘sinceImagePushed’.
countNumber Numero di immagini da conservare o numero di giorni di età massima.
type Tipo di azione da intraprendere. L’unico valore disponibile è ‘expire’.

Esempio di file ‘policy.json’:

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

Il comando CLI per impostare la policy:

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

Metodo 3: Configurazione della Policy del Ciclo di Vita tramite Script

Ecco uno script Python con ‘boto3’ per configurare la policy del ciclo di vita:

import boto3

client = boto3.client('ecr')

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

print(response)

Applicare una Stessa Policy a Più Repository

Spesso è utile applicare la stessa policy a più repository. Invece di configurare le politiche manualmente per ogni repository, puoi usare questo script:

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

Con AWS ECR è facile implementare policy del ciclo di vita per eliminare automaticamente le immagini obsolete. AWS fornisce ampia documentazione ed esempi di policy. È possibile sperimentare con diverse configurazioni, ad esempio basate sulla data di caricamento dell’immagine. Esplorare queste funzionalità permette di ottimizzare l’uso di AWS ECR.