Jak odstranit neoznačené a starší obrázky AWS ECR?

Optimalizace správy kontejnerů v AWS ECR

Amazon ECR úzce spolupracuje s Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) a AWS Lambda, čímž zjednodušuje celý vývojový proces až po produkční nasazení.

Amazon ECR poskytuje hosting obrazů v robustní, vysoce škálovatelné a dostupné infrastruktuře. Díky tomu můžete spolehlivě nasazovat kontejnery pro všechny vaše aplikace. Pro udržení pořádku je nezbytné pravidelně mazat nepotřebné, neoznačené a zastaralé obrazy.

V současnosti běží aplikace často jako mikroslužby. Mikroslužba není nic jiného než kontejner, který v sobě sdružuje veškerý kód i jeho závislosti, což umožňuje aplikaci běžet efektivně a spolehlivě v jakémkoli výpočetním prostředí. Kontejnery jsou díky své přenositelnosti, malé velikosti a jednoduchosti stále častěji využívány pro transport moderních aplikací.

Kontejnery jsou vytvářeny z šablon jen pro čtení, které se nazývají obrazy. Tyto obrazy musí být někde bezpečně uloženy, aby je mohl získat jakýkoli autorizovaný stroj.

Právě zde přichází na scénu registr kontejnerů. Dříve vývojáři často využívali DockerHub k ukládání těchto obrazů a artefaktů. Pokud ovšem používáte cloudové služby AWS, s velkou pravděpodobností už využíváte AWS ECR, což je alternativa k DockerHubu.

AWS ECR je plně spravovaná služba pro registry kontejnerů, která zajišťuje vysoký výkon hostingu. Umožňuje vám nasazovat obrazy a artefakty aplikací ve formě veřejných i soukromých úložišť.

Každý den aplikace hostované v AWS vkládají a stahují miliony obrazů a artefaktů aplikací do a z konkrétních úložišť ECR.

V tomto článku si rozebereme, jak efektivně čistit staré a zbytečné obrazy v AWS ECR a udržovat tak úložiště v optimálním stavu.

Proč je nutné mazat neoznačené a staré obrazy?

Hlavním důvodem pro čištění úložišť ECR je udržení pořádku ve vývoji. Nikdo nechce ve svých registrech uchovávat obrazy starší než několik posledních nasazení. Důvodem je i skutečnost, že rollbacky v odvětví jsou sice běžné, ale rollback na artefakt, který je starší než pět nasazení, je spíše výjimkou.

Zjednodušeně řečeno, jakýkoli obraz nebo artefakt starší než pět nasazení je zbytečný. I když se toto pravidlo může v rámci strategie vaší organizace lišit, nedoporučujeme odchýlení se od tohoto osvědčeného postupu.

V celém odvětví se značkování používá k identifikaci nejstabilnějších a nejnovějších obrazů. Během životního cyklu vývoje softwaru se obrazy generují rychle a stávající značky jsou nahrazovány novými. Starší obrazy tak zůstávají neoznačené a bez využití.

V situacích, kdy jsou obrazy a artefakty velké, rostou i náklady na úložiště v ECR. Cena AWS ECR je „0,10 $ za GB/měsíc pro data uložená v soukromých nebo veřejných úložištích.“

I když se tato cena může zdát malá, jak se říká, i kapka dělá moře. Pokud jsou tyto obrazy uchovávány po delší dobu, budou mít dopad na vaše vyúčtování AWS.

Proto doporučujeme odstraňovat staré a neoznačené obrazy z vašich repozitářů ECR – jednoduše je nepotřebujete. Proč je uchovávat a platit za to?

Ruční odstranění obrazů v AWS ECR

Metoda 1: Grafické uživatelské rozhraní (GUI)

Krok 1: Přihlaste se ke svému účtu Amazon Web Services a přejděte do úložiště, které chcete vyčistit.

Krok 2: V úložišti uvidíte nejnovější značku, která označuje nejstabilnější verzi. Ostatní značky jsou zpravidla neoznačené. Pro smazání vyberte požadovaný obraz a klikněte na Smazat.

Krok 3: Potvrďte smazání

Metoda 2: Příkazový řádek (CLI)

Pro odstranění obrazu pomocí CLI musíte mít na svém počítači nakonfigurované přístupové klíče AWS IAM a mít příslušná oprávnění IAM pro přístup k úložištím.

V tomto případě je předpokládáme, že již máte nakonfigurováno. Pokud nemáte, můžete tak učinit pomocí průvodce základní konfigurací AWS.

Pokud si nejste jisti, zda máte na svém počítači správně nastavený AWS CLI, použijte následující příkaz pro ověření:

aws sts get-caller-identity

Po ověření, že můžeme používat AWS CLI, můžete odstranit neoznačený obraz ECR pomocí tohoto příkazu:

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

V tomto případě děláme totéž jako v GUI. Odstraníme obraz označený jako `custom-image-6`, který se nachází v úložišti `test-ecr-policy`.

Metoda 3: Skriptování

Pro tuto metodu je nutné mít na počítači, na kterém běžíte, nakonfigurovaný přístupový klíč AWS.

Skript pro odstranění neoznačených obrazů:

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)

Odpověď by měla obsahovat seznam smazaných ID obrazů spolu s informací o případných chybách.

Plánované odstranění obrazů ECR

Pokud pracujete v oblasti DevOps nebo pravidelně spravujete AWS ECR, jste si již vědomi problémů spojených s ručním mazáním těchto obrazů.

Spouštění skriptu nebo příkazů tuto situaci sice zjednodušuje, ale ideální by bylo, kdyby se obrazy mazaly automaticky, bez nutnosti zásahu.

Dobrou zprávou je, že AWS ECR nabízí zásady životního cyklu pro vaše obrazy, které lze nastavit tak, aby byly tyto obrazy mazány včas a podle plánu. Podívejme se, jak na to.

Metoda 1: Grafické uživatelské rozhraní (GUI)

Krok 1: Přejděte do úložiště, pro které chcete nastavit zásady životního cyklu. V levém panelu vidíte sekci pro zásady životního cyklu. Můžete na ni kliknout a začít.

Krok 2: Klikněte na vytvoření nového pravidla.

Krok 3: ECR umožňuje mazat obrazy na základě dvou podmínek. Buď když obrazy dosáhnou určitého stáří (počet dnů), nebo pokud jsou označené/neoznačené a chcete je uchovat pouze po dobu X dní.

Podívejme se na to blíže. Můžete nastavit, aby se neoznačené obrazy smazaly, pokud jsou jeden den nebo starší, případně pokud počet neoznačených obrazů překročí určitou hodnotu.

Vyberte si podle svých požadavků. Nezapomeňte, že čísla můžete upravit dle vlastního uvážení. Uložením pravidlo životního cyklu aktivujete.

Metoda 2: Příkazový řádek (CLI)

Pro nastavení zásad životního cyklu v AWS ECR pomocí CLI slouží příkaz `put-lifecycle-policy`.

Než tak učiníte, je potřeba vytvořit JSON soubor se seznamem podmínek zásad. Můžete ho pojmenovat `policy.json` nebo jakkoliv jinak.

Podívejme se na jednotlivé elementy zásad životního cyklu:

rulePriority (Typ: integer, Povinné: ano):

Určuje pořadí pravidel od nejnižšího k nejvyššímu. Nejprve se uplatní pravidla s prioritou 1, následně s prioritou 2 atd. Každé pravidlo musí mít jedinečnou hodnotu priority.

Pravidla nemusí mít po sobě jdoucí hodnoty. Pravidla pro obrazy s jakýmikoli značkami by měla mít nejvyšší prioritu a měla by být zkontrolována jako poslední.

description (Typ: string, Povinné: ne):

Popisuje, k čemu dané pravidlo v zásadách životního cyklu slouží.

tagStatus (Typ: string, Povinné: ano):

Definuje, zda přidané pravidlo zásad životního cyklu specifikuje značku obrázku. Může nabývat hodnot: `tagged` (označené), `untagged` (neoznačené) nebo `any` (jakékoli). Pokud není uvedena žádná hodnota, vyhodnotí se všechny obrazy. Pokud je nastavena hodnota `tagged`, musí být zadána hodnota `tagPrefixList`. Pokud je nastavena hodnota `untagged`, `tagPrefixList` se vynechává.

tagPrefixList (Typ: list[string], Povinné: ano, pouze pokud tagStatus je nastaven na tagged):

Pokud je „tagStatus“ nastaven na „tagged“, vyžadují vaše zásady životního cyklu seznam předpon značek obrázků oddělených čárkami.

S pomocí předpony tagu `prod` můžete vybrat všechny obrazy označené jako `prod`, `prod1`, `prod2` atd. Pokud použijete více tagů, budou vybrány pouze obrazy, které mají všechny tyto tagy.

countType (Typ: string, Povinné: ano):

Pokud je `countType` nastaven na `imageCountMoreThan`, použijte `countNumber` pro omezení počtu obrazů v úložišti.

Pokud je `countType` nastaven na `sinceImagePushed`, použijte `countUnit` a `countNumber` pro omezení stáří obrazů v úložišti.

countUnit (Typ: string, Povinné: ano, pouze pokud je countType nastaven na sinceImagePushed):

Jednotku počtu zadejte pouze pokud je `countType` nastaven na `sinceImagePushed`, jinak dojde k chybě.

countNumber (Typ: integer, Povinné: ano):

Použijte pouze kladná celá čísla (0 není platná hodnota). Pokud `countType` je `imageCountMoreThan`, hodnota určuje maximální počet obrázků, které se mají ponechat. Pokud je `countType` nastaven na `sinceImagePushed`, hodnota určuje maximální stáří obrázku.

type (Typ: string, Povinné: ano):

Vyberte typ akce. Jedinou dostupnou hodnotou je `expire` (odstranění).

Níže je příklad souboru `policy.json`:

{
"rules": [
{
"rulePriority": 1,
"description": "Smazat obrazy starší než 10 dní",
"selection": {
"tagStatus": "untagged",
"countType": "sinceImagePushed",
"countUnit": "days",
"countNumber": 14
},
"action": {
"type": "expire"
}
}
]
}

Přizpůsobte si soubor podle požadavků vaší organizace. `sinceImagePushed` můžete nahradit `imageCountMoreThan`.

Příkaz CLI pro nastavení těchto zásad by vypadal takto:

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

Metoda 3: Skriptování

Pro tento účel využijeme knihovnu `boto3`. Můžeme použít stejný soubor `policy.json` jako v předchozím případě. Níže je uveden příklad kódu:

import boto3

client = boto3.client('ecr')

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

print(response)

Jak aplikovat jednu zásadu na více úložišť ECR?

Často se objevuje dotaz, jak aplikovat stejné zásady na více úložištích.

Ruční nastavování zásad je opakující se a zdlouhavý úkol.

Níže je uveden úryvek kódu, který lze použít v produkčním prostředí pro aplikování zásad na více než 100 úložišť.

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 = 'vložte sem vaše zásady'

for repo in repositories:

repoName = repo['repositoryName']

client.put_lifecycle_policy( repositoryName = repoName,lifecyclePolicyText = globalLifecyclePolicy)

Závěr

Vytvoření a správa zásad životního cyklu ECR je poměrně jednoduchý způsob, jak automaticky mazat starší obrazy podle definovaných kritérií. AWS poskytuje rozsáhlou dokumentaci a příklady zásad životního cyklu.

Můžete experimentovat s různými zásadami pro označené obrazy, například s odpovídajícími kritérii na základě data nahrání obrazu.

Pro další rozšíření vašich znalostí o AWS doporučujeme prozkoumat i další klíčové terminologie spojené s touto platformou.