Amazon ECR se besprekorno integriše sa Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) i AWS Lambda, pojednostavljujući put od razvoja do produkcije.
Amazon ECR skladišti slike u visoko skalabilnoj i dostupnoj arhitekturi, omogućavajući vam da pouzdano implementirate kontejnere za svoje aplikacije. Važno je redovno uklanjati neoznačene i zastarele slike radi održavanja urednosti i efikasnosti sistema.
Današnje aplikacije sve češće funkcionišu kao mikroservisi. Mikroservis je u osnovi kontejner koji obuhvata sav kod i njegove zavisnosti, omogućavajući aplikaciji da radi brzo i pouzdano u bilo kom računarskom okruženju. Zahvaljujući svojoj prenosivosti, maloj veličini i praktičnosti, kontejneri postaju preferirani način za isporuku savremenih aplikacija.
Kontejneri se kreiraju na osnovu šablona koji su samo za čitanje, a nazivaju se slike. Ove slike moraju biti uskladištene na nekom mestu kako bi ih bilo koja autorizovana mašina mogla preuzeti.
Tu na scenu stupa registar kontejnera. Ne tako davno, DockerHub se često koristio za čuvanje ovih slika i artefakata. Međutim, ako koristite AWS cloud servise, verovatno već koristite AWS ECR, koji predstavlja alternativu DockerHub-u.
AWS ECR je potpuno upravljani registar kontejnera koji pruža visokoperformansno skladištenje, omogućavajući vam da implementirate slike i artefakte aplikacija u obliku javnih i privatnih repozitorijuma.
Svakodnevno, brojne aplikacije hostovane na AWS-u šalju i preuzimaju milione slika i artefakata u i iz određenih ECR repozitorijuma.
U ovom članku ćemo detaljnije analizirati kako da očistite stare i neaktivne AWS ECR slike, održavajući vaše ECR repozitorijume urednim i optimizovanim.
Zašto je važno ukloniti neoznačene i zastarele slike?
Osnovni razlog za redovno čišćenje ECR repozitorijuma je održavanje higijene razvoja. Razvojni timovi obično ne žele da čuvaju slike koje su starije od deset verzija unutar svojih ECR repozitorijuma. Takođe, vraćanje na prethodne verzije je uobičajeno u industriji, ali retko kada je potrebno vratiti se na promene koje su starije od pet artefakata.
Jednostavnije rečeno, sve slike i artefakti stariji od pet implementacija su uglavnom nepotrebni. Ovo se može prilagoditi u skladu sa strategijom vaše organizacije, ali to generalno nije preporučljivo kao najbolja praksa.
Uobičajeno je da se oznake koriste za identifikovanje najstabilnijih, najnovijih, ili poslednjih pet verzija slika. Tokom razvoja softvera, slike se brzo generišu i ove oznake se često zamenjuju novim, ostavljajući starije slike neoznačenim i nepotrebnim.
U takvim situacijama, kada su slike i artefakti veliki, to dovodi do povećanja troškova skladištenja na ECR-u. Cena AWS ECR-a je „0.10 USD po GB mesečno za podatke uskladištene u privatnim ili javnim repozitorijumima“.
Iako ova cena može izgledati niska, sve te stare slike, ako se čuvaju duže vreme, mogu značajno povećati vaše AWS troškove. Svaka kap čini okean, kako se kaže.
Stoga, preporučuje se da redovno uklanjate ove stare i neoznačene slike iz ECR repozitorijuma, jer one nisu potrebne i samo zauzimaju prostor i resurse. Zašto ih čuvati i plaćati za njih?
Ručno brisanje AWS ECR slika
Metod 1: Korišćenje GUI
Korak 1: Prijavite se na svoj Amazon Web Services nalog i navigirajte do repozitorijuma koji želite da očistite.
Korak 2: Ovde možete videti da repozitorijum ima najnoviju oznaku koja ukazuje na najstabilniju verziju. Ostale oznake koje vidite se mogu smatrati neoznačenim. Da biste obrisali slike, jednostavno izaberite željenu sliku i kliknite na dugme za brisanje.
Korak 3: Potvrdite brisanje slike.
Metod 2: Korišćenje CLI
Da biste obrisali sliku koristeći CLI, neophodno je da imate sve AWS IAM pristupne ključeve konfigurisane na vašoj mašini, kao i potrebne IAM dozvole za pristup repozitorijumima.
U ovom slučaju, pretpostavlja se da je konfiguracija već obavljena. Ako još uvek niste konfigurisali, možete to učiniti koristeći AWS vodič za osnovnu konfiguraciju.
Ako niste sigurni da li ste pravilno konfigurisali AWS CLI na svom računaru, koristite sledeću komandu da biste proverili:
aws sts get-caller-identity
Sada kada ste potvrdili da možete da koristite AWS CLI, možete koristiti sledeću komandu za brisanje neoznačenih ECR slika.
aws ecr batch-delete-image --repository-name test-ecr-policy --image-ids imageTag=custom-image-6
U ovom koraku radimo nešto slično kao u GUI. Brišemo sliku sa oznakom custom-image-6 koja se nalazi u repozitorijumu test-ecr-policy.
Metod 3: Korišćenje skripte
Preduslov za ovaj metod je da imate konfigurisan AWS Access key na mašini sa koje radite.
Skripta za brisanje neoznačenih slika:
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)
Odgovor koji dobijete će sadržati listu izbrisanih ID-ova slika, kao i eventualne greške.
Automatizovano brisanje ECR slika
Ako ste DevOps inženjer ili redovno upravljate AWS ECR-om, sigurno ste svesni izazova i napora koje zahteva ručno brisanje slika.
Pokretanje skripte ili komande olakšava stvari, ali verovatno biste preferirali rešenje koje automatski briše slike, bez potrebe za vašom intervencijom.
Dobra vest je da AWS ECR nudi politike životnog ciklusa za vaše slike, koje možete podesiti da automatski brišu slike po određenom rasporedu ili pod određenim uslovima. Pogledajmo kako to funkcioniše.
Metod 1: Korišćenje GUI
Korak 1: Idite na repozitorijum za koji želite da podesite politiku životnog ciklusa. Na levoj strani možete videti opciju „Lifecycle policies“. Kliknite na nju da biste započeli.
Korak 2: Kliknite na opciju da kreirate svoje prvo pravilo.
Korak 3: ECR omogućava brisanje slika na osnovu dva uslova: ako su slike starije od određenog broja dana, ili ako su označene/neoznačene, i želite da ih zadržite samo određeni broj dana.
Pogledajmo kako to funkcioniše. Sada možete podesiti da li želite da izbrišete neoznačene slike ako su starije od jednog dana ili više, ili ako broj neoznačenih slika prelazi određeni broj.
Izaberite opcije u skladu sa vašim potrebama. Možete povećati ove brojeve u skladu sa svojim potrebama. Sačuvajte podešavanja da biste aktivirali pravilo životnog ciklusa.
Metod 2: Korišćenje CLI
AWS ECR CLI komanda za postavljanje politike životnog ciklusa je put-lifecycle-policy.
Pogledajmo kako se to radi. Za ovo, potrebno je da kreirate JSON datoteku koja definiše uslove politike. Možete je nazvati policy.json ili bilo kojim imenom po vašem izboru.
Pre toga, hajde da pogledamo elemente politike životnog ciklusa:
rulePriority (Tip: integer, Obavezno: da):
Redosled primene pravila od nižeg ka višem. Pravila politike životnog ciklusa sa prioritetom jedan se primenjuju prva, zatim pravila sa prioritetom dva i tako dalje. Svako pravilo politike životnog ciklusa mora imati jedinstvenu vrednost prioriteta.
Pravila politike ne moraju imati uzastopne vrednosti. Označena pravila moraju imati najveći prioritet i pregledaju se poslednja.
description (Tip: string, Obavezno: ne):
Objašnjava čemu služi dato pravilo u politici životnog ciklusa.
tagStatus (Tip: string, Obavezno: da):
Proverava da li dato pravilo politike životnog ciklusa specificira oznaku slike. Vrednosti mogu biti: „tagged“, „untagged“ ili „any“. Ako nijedna nije navedena, sve slike se evaluiraju. „Tagged“ zahteva „tagPrefixList“ vrednost. „Untagged“ zahteva izostavljanje „tagPrefixList“.
tagPrefixList (Tip: list[string], Obavezno: da, samo ako je tagStatus podešen na tagged):
Ako je „tagStatus“ podešen na „tagged“, vaša politika životnog ciklusa zahteva listu prefiksa oznaka slika razdvojenih zarezima.
Koristeći prefiks oznake „prod“, možete odabrati sve slike označene kao „prod“, „prod1“, „prod2“ itd. Više oznaka odabira samo slike koje imaju sve te oznake.
countType (Tip: string, Obavezno: da):
Specificirajte „countNumber“ ako je „countType“ podešen na „imageCountMoreThan“ da biste ograničili broj slika u repozitorijumu.
Specificirajte „countUnit“ i „countNumber“ ako je „countType“ podešen na „sinceImagePushed“ da biste ograničili slike repozitorijuma.
countUnit (Tip: string, Obavezno: da, samo ako je countType podešen na sinceImagePushed):
Specificirajte jedinicu brojanja samo kada je „countType“ podešen na „sinceImagePushed“, u suprotnom dolazi do greške.
countNumber (Tip: integer, Obavezno: da):
Samo pozitivni celi brojevi (0 nije prihvatljiva vrednost). Ako je „countType“ postavljen na „imageCountMoreThan“, vrednost predstavlja maksimalan broj slika koje treba zadržati. Korišćenje „sinceImagePushed“ kao „countType“ određuje maksimalnu starost slike.
type (Tip: string, Obavezno: da):
Odaberite tip akcije. Vrednost koja se može koristiti je „expire“.
Evo primera moje „policy.json“ datoteke:
{ "rules": [ { "rulePriority": 1, "description": "Expire images older than 10 days", "selection": { "tagStatus": "untagged", "countType": "sinceImagePushed", "countUnit": "days", "countNumber": 14 }, "action": { "type": "expire" } } ] }
Prilagodite ovu konfiguraciju prema potrebama vaše organizacije. „sinceImagePushed“ se može zameniti sa „imageCountMoreThan“.
CLI komanda za postavljanje ove politike bi bila:
aws ecr put-lifecycle-policy --repository-name "test-ecr-polict" --lifecycle-policy-text "file://policy.json"
Metod 3: Korišćenje skripte
Koristićemo boto3 komandu da postignemo željeni rezultat. Možemo koristiti istu „policy.json“ datoteku za konfiguraciju. Ispod je prikazan isječak koda.
import boto3 client = boto3.client('ecr') response = client.put_lifecycle_policy( registryId='PODES12342', repositoryName="test-ecr-policy", lifecyclePolicyText="plicy.json" ) print(response)
Kako primeniti jednu politiku na više ECR repozitorijuma?
Često se postavlja pitanje kako da se ista politika primeni na više repozitorijuma.
Ručno postavljanje politike je repetitivan i dosadan zadatak.
Evo isječka koda koji se može koristiti u produkcionom okruženju za primenu politike na stotine repozitorijuma:
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)
Zaključak
Možemo lako kreirati ECR politiku životnog ciklusa i automatski uklanjati zastarele slike na osnovu definisanih parametara. AWS nudi opsežnu dokumentaciju, kao i primere politika životnog ciklusa.
Možete eksperimentisati i sa alternativnim politikama za označene slike, kao što je usklađivanje kriterijuma sa datumom kada je slika otpremljena.
Takođe, možete istražiti i neke ključne AWS termine koji će unaprediti vaše AWS znanje.