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.