Cum să ștergeți imaginile AWS ECR neetichetate și mai vechi?

Amazon ECR este integrat cu Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) și AWS Lambda, simplificând fluxul de lucru de dezvoltare la producție.

Amazon ECR găzduiește imaginile într-o arhitectură foarte scalabilă și disponibilă, permițându-vă să implementați containere în mod fiabil pentru aplicațiile dvs. Este important să ștergeți imaginile neetichetate și vechi pentru a menține igiena.

Astăzi, aplicațiile rulează ca micro-serviciu. Termenul de micro-serviciu nu este altceva decât un container care împachetează tot codul și dependențele acestuia, astfel încât aplicația să poată rula rapid și fiabil în orice mediu de calcul. Datorită portabilității, dimensiunilor mici și confortului lor, containerele devin o metodă de alegere pentru expedierea aplicațiilor moderne.

Containerele sunt proiectate dintr-un șablon numai pentru citire numit imagine. Aceste imagini trebuie să fie stocate undeva, astfel încât să poată fi preluate de orice mașină autorizată să le folosească.

Aici intervine un registru de containere. Nu cu mult timp în urmă, oamenii foloseau DockerHub pentru a stoca aceste imagini și artefacte. Dar, dacă utilizați servicii cloud AWS, sunt sigur că utilizați deja AWS ECR, care este o alternativă la DockerHub.

AWS ECR este un registru de containere complet gestionat care oferă găzduire de înaltă performanță, permițându-vă să implementați imagini și artefacte ale aplicației sub formă de depozite publice și private.

În fiecare zi, mai multe aplicații găzduite de AWS împing și extrag milioane de imagini/artefacte ale aplicației în/din arhivele ECR specifice.

În acest articol, vom discuta despre cum să ștergem AWS ECR vechi și învechit și să păstrăm curate depozitele ECR.

Nevoia: ștergeți acum imaginile neetichetate și vechi!

Motivul principal pentru curățarea depozitelor ECR este igiena dezvoltării. În orice moment, nimeni nu ar dori să păstreze imagini mai vechi de zece implementări în ECR-urile lor. De asemenea, se întâmplă pentru că în industrie se întâmplă frecvent derulări, dar o derulare care anulează schimbarea de la 5 artefacte mai devreme este rară.

În termeni mai simpli, orice imagine/artefacte mai vechi de cinci implementări sunt inutile. Acesta poate fi modificat în raportul de strategie al organizației dvs., dar nu l-am recomanda ca cea mai bună practică.

  Conduceți mai bine întâlnirile dvs. online cu Otter

În întreaga industrie, etichetarea este utilizată pentru a specifica cele mai stabile cele mai recente sau ultimele cinci imagini recente. Ca parte a ciclului de viață al dezvoltării software, imaginile sunt generate rapid, iar aceste etichete sunt înlocuite cu imagini noi, lăsând imaginile mai vechi neetichetate și inutile.

În situații ca aceasta, în care imaginile/artefactele sunt mari, va adăuga și taxe de stocare pe ECR. Prețul AWS ECR este de „0,10 USD per GB/lună pentru datele stocate în depozite private sau publice”.

Acest preț ți se poate părea mic, dar după cum se spune, picăturile formează oceanul. Toate aceste imagini, dacă sunt puse în depozit pentru o perioadă mai lungă, vor adăuga facturi mai mari la facturile dvs. AWS.

Sugestia este să ștergeți aceste imagini vechi și neetichetate din arhivele dvs. ECR, deoarece nu aveți nevoie de ele! Simplu! De ce să-l păstrezi și să plătești pentru el?

Ștergerea manuală a imaginilor AWS ECR

Metoda 1: Calea GUI!

Pasul 1: Conectați-vă la contul Amazon Web Services și mergeți la depozitul pe care doriți să îl ștergeți.

Pasul 2: Aici, puteți vedea că depozitul are cea mai recentă etichetă pentru a specifica cea mai stabilă versiune. Celelalte etichete pe care le vedeți pot fi numite neetichetate. Pentru a șterge, trebuie doar să selectăm imaginea și să facem clic pe ștergere.

Pasul 3: Confirmați pentru a șterge

Metoda 2: Calea CLI!

Pentru a șterge o imagine folosind CLI, veți avea nevoie de toate cheile de acces AWS IAM configurate pe mașina dvs. și de permisiunea IAM necesară pentru a vă oferi acces la depozite.

În acest caz, l-am configurat deja. Puteți face acest lucru din ghidul de bază pentru configurare AWS, dacă nu ați făcut-o deja.

Dacă nu sunteți sigur că ați configurat AWS CLI pe computer, utilizați următoarea comandă pentru a verifica.

aws sts get-caller-identity

Acum că am confirmat că putem folosi AWS CLI, puteți folosi următoarea comandă pentru a șterge o imagine ECR neetichetată.

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

Aici facem ceva similar cu ceea ce am făcut în GUI. Vom șterge imaginea etichetată ca custom-image-6 care se află în depozitul test-ecr-policy.

Metoda 3: Calea scripturilor!

Condiția prealabilă pentru această metodă este să aveți o cheie de acces AWS configurată în mașina pe care rulați.

Script pentru ștergerea imaginilor neetichetate.

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)

Răspunsul vă va oferi lista de ID-uri de imagine șterse, împreună cu un eșec, dacă există.

  Cum să creezi evenimente din calendar din e-mail pe iPhone și iPad

Metoda de programare pentru a șterge imaginile ECR

Dacă sunteți inginer DevOps sau gestionați în mod regulat AWS ECR, veți cunoaște deja durerile de a șterge aceste imagini manual.

Rularea scriptului/comandei face lucrurile mai ușoare, dar suntem siguri că v-ați fi dorit ceva care să ștergă automat aceste imagini de la sine, fără să vă faceți griji pentru ele.

Veste bună, AWS ECR oferă o politică de ciclu de viață pentru imaginile dvs., pe care o puteți seta pentru a șterge aceste imagini în timp util sau programat. Să vedem cum se face.

Metoda 1: Calea GUI!

Pasul 1: Mergeți la depozitul unde doriți să setați politica ciclului de viață. În panoul din stânga, puteți vedea Politica ciclului de viață. Puteți face clic pe el pentru a începe.

Pasul 2: Puteți face clic pe el și puteți crea prima regulă.

Pasul 3: ECR vă permite să ștergeți imagini în două condiții, una este dacă imaginile dvs. au o vechime de zile specificate sau dacă sunt etichetate/neetichetate și doriți să le păstrați doar pentru, de exemplu, un număr X de zile.

Să vedem cum se face. Acum puteți seta dacă doriți să ștergeți imaginile neetichetate dacă acestea au o zi sau mai vechi sau dacă numărul imaginilor neetichetate depășește una.

Alegeți în funcție de cazul dvs. de utilizare. Nu uita; puteți crește aceste numere la numărul dorit. Salvați pentru a declanșa regula ciclului de viață.

Metoda 2: Calea CLI!

Comanda AWS ECR CLI pentru a seta politica ciclului de viață este put-lifecycle-policy.

Să vedem cum se face. Pentru aceasta, trebuie să creați un fișier JSON care listează condițiile politicii. Îi puteți numi policy.json sau orice nume la alegere.

Dar înainte de asta, să ne uităm la elementele politicii ciclului de viață.

rulePriority (Type: integer, Required: yes):

Ordinea regulilor de la mai jos la mai mare. Regulile politicii ciclului de viață cu prioritate unu sunt aplicate mai întâi, apoi 2 etc. Regulile politicii ciclului de viață trebuie să aibă fiecare o valoare de regulă unică.

Regulile politicii nu au nevoie de valori consecutive. Orice reguli etichetate trebuie să aibă cea mai mare prioritate de regulă și să fie revizuite ultima.

description (Type: string, Required: no):

Explică la ce servește o regulă dintr-o politică de ciclu de viață.

tagStatus (Type: string, Required: yes):

Verifică dacă regula de politică ciclului de viață adăugată specifică o etichetă de imagine. Etichetat, neetichetat sau oricare este OK. Dacă nu este specificat niciuna, toate imaginile sunt evaluate. Etichetat necesită o valoare tagPrefixList. Neetichetat necesită omiterea tagPrefixList.

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

Dacă „tagStatus” este „etichetat”, politica ciclului de viață necesită o listă de prefixe de etichete de imagine, separate prin virgulă.

  Unde este cel mai bun loc pentru un difuzor inteligent într-o cameră?

Folosind prefixul etichetei prod, puteți specifica toate imaginile marcate cu prod, prod1, prod2 etc. Etichetele multiple aleg numai imaginile cu toate etichetele.

countType (Type: string, Required: yes):

Specificați countNumber dacă countType este imageCountMoreThan pentru a limita numărul de imagini din depozitul dvs.

Specificați countUnit și countNumber dacă countType este sinceImagePushed pentru a limita imaginile depozitului.

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

Specificați o unitate de numărare numai atunci când countType este sinceImagePushed; în caz contrar, apare o eroare.

countNumber (Type: integer, Required: yes):

Numai numere întregi pozitive (0 nu este o valoare acceptată). Dacă countType este imageCountMoreThan, valoarea este numărul maxim de fotografii de păstrat. Utilizarea sinceImagePushed ca countType determină vârsta maximă a imaginii.

 type (Type: string, Required: yes):

Alegeți un tip de acțiune. Valoarea care poate fi folosită este „expire”.

Iată „policy.json” meu.

{

"rules": [

{

"rulePriority": 1,

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

"selection": {

"tagStatus": "untagged",

"countType": "sinceImagePushed",

"countUnit": "days",

"countNumber": 14

},

"action": {

"type": "expire"

}

}

]

}

Conform cerințelor organizației dvs. „sinceImagePushed” poate fi înlocuit cu „imageCountMoreThan”.

Comanda CLI pentru a seta această politică ar fi:

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

Metoda 3: Calea scripturilor!

Vom folosi comanda boto3 pentru a realiza acest lucru. Putem folosi același „policy.json” pentru a configura acest lucru. Mai jos este fragmentul de cod folosit.

import boto3

client = boto3.client('ecr')

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

print(response)

Cum se aplică o singură politică în mai multe depozite ECR?

Adesea, există întrebări despre cum să aplicați aceeași politică în mai multe depozite.

Este o sarcină repetitivă și plictisitoare să setați politicile manual.

Iată un fragment de cod care poate fi folosit în sistemul de producție pentru a aplica o politică în mai mult de 100 de depozite.

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)

Concluzie

Putem construi cu ușurință o politică de ciclu de viață ECR și putem distruge imaginile mai vechi în conformitate cu parametrii specificați. AWS oferă documentație extinsă, precum și mostre de politici privind ciclul de viață.

De asemenea, puteți experimenta politici alternative pentru imaginile etichetate, cum ar fi criteriile de potrivire cu data la care imaginea a fost încărcată.

De asemenea, puteți explora unele terminologii cheie AWS care vă avansează învățarea AWS.