Jak usunąć nieoznakowane i starsze obrazy AWS ECR?

Zarządzanie obrazami kontenerów w Amazon ECR: Usuwanie przestarzałych i nieoznaczonych obrazów

Amazon ECR, czyli Elastic Container Registry, stanowi integralną część ekosystemu AWS, płynnie współpracując z Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) oraz AWS Lambda. To ułatwia proces budowania i wdrażania aplikacji.

Platforma Amazon ECR charakteryzuje się wysoką skalowalnością i dostępnością, co zapewnia niezawodne środowisko dla wdrażania kontenerów w aplikacjach. Kluczowym aspektem utrzymania porządku jest regularne usuwanie starych i nieoznakowanych obrazów.

Współczesne aplikacje coraz częściej przyjmują architekturę mikrousług, gdzie każda mikrousługa jest zapakowana jako kontener. Kontener zawiera cały kod oraz jego zależności, co umożliwia szybkie i niezawodne działanie w dowolnym środowisku. Dzięki swojej mobilności, niewielkim rozmiarom i wygodzie, kontenery stały się preferowaną metodą wdrażania nowoczesnych aplikacji.

Podstawą kontenerów są obrazy, które są szablonami tylko do odczytu. Obrazy te muszą być gdzieś przechowywane, aby mogły być pobierane przez uprawnione maszyny. Tutaj właśnie swoją rolę odgrywa rejestr kontenerów. Jeszcze niedawno DockerHub był popularnym miejscem do przechowywania tych artefaktów. Obecnie, użytkownicy AWS często korzystają z AWS ECR, stanowiącego alternatywę dla DockerHub.

AWS ECR to w pełni zarządzana usługa rejestru kontenerów, która zapewnia wydajne hostowanie obrazów aplikacji w publicznych i prywatnych repozytoriach. Codziennie, aplikacje działające w AWS wysyłają i pobierają miliony obrazów i artefaktów z różnych repozytoriów ECR.

W tym artykule omówimy, jak skutecznie oczyszczać repozytoria AWS ECR z nieaktualnych i nieużywanych obrazów.

Dlaczego warto usuwać nieoznaczone i przestarzałe obrazy?

Głównym powodem, dla którego powinniśmy regularnie czyścić repozytoria ECR, jest zachowanie porządku. Nie ma sensu przechowywanie w ECR obrazów starszych niż kilka ostatnich wdrożeń. Często dochodzi do wycofywania zmian, jednak cofanie zmian z bardzo odległych wersji jest rzadkością.

Zazwyczaj obrazy starsze niż pięć ostatnich wdrożeń stają się nieprzydatne. Dokładna liczba może być ustalona w polityce organizacji, ale zaleca się usuwanie starszych wersji. Taki proces zapewnia optymalizację i przejrzystość repozytoriów.

W branży IT popularne jest tagowanie, które pozwala na identyfikację najnowszych, stabilnych wersji. W procesie rozwoju oprogramowania, obrazy są generowane bardzo często, a tagi są nadpisywane nowymi obrazami. W rezultacie, starsze obrazy pozostają nieoznakowane i nieużywane.

Przechowywanie dużej liczby obrazów, zwłaszcza tych o większym rozmiarze, wiąże się z dodatkowymi opłatami. Cena w AWS ECR wynosi 0,10 USD za GB miesięcznie dla danych przechowywanych w repozytoriach prywatnych lub publicznych. Chociaż pojedyncza kwota może wydawać się niska, skumulowane koszty przechowywania dużej ilości starych i niepotrzebnych obrazów mogą znacząco wpłynąć na rachunki.

Dlatego regularne usuwanie starych i nieoznakowanych obrazów z repozytoriów ECR jest nie tylko zalecane, ale wręcz niezbędne. Dlaczego płacić za coś, czego nie potrzebujemy? Optymalizacja kosztów i porządek w repozytoriach to klucz do efektywnego zarządzania zasobami AWS.

Ręczne usuwanie obrazów AWS ECR

Metoda 1: Interfejs Graficzny (GUI)

Krok 1: Zaloguj się do swojego konta Amazon Web Services i przejdź do repozytorium, które chcesz oczyścić.

Krok 2: W repozytorium znajdziesz tagi wskazujące aktualnie używane wersje, a także nieoznakowane obrazy. Aby usunąć wybrany obraz, zaznacz go i kliknij opcję „usuń”.

Krok 3: Potwierdź usunięcie obrazu.

Metoda 2: Interfejs Wiersza Poleceń (CLI)

Aby usunąć obraz za pomocą interfejsu wiersza poleceń, niezbędne jest posiadanie skonfigurowanych kluczy dostępu AWS IAM oraz odpowiednich uprawnień do repozytoriów. Jeśli nie masz pewności, czy CLI jest prawidłowo skonfigurowane, możesz to zweryfikować za pomocą polecenia:

aws sts get-caller-identity

Po potwierdzeniu konfiguracji, użyj poniższego polecenia, aby usunąć nieoznakowany obraz z ECR:

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

Powyższe polecenie usunie obraz oznaczony jako „custom-image-6” z repozytorium „test-ecr-policy”.

Metoda 3: Skryptowanie

Wymagane jest skonfigurowanie kluczy dostępu AWS na komputerze, na którym będziesz wykonywać skrypt. Poniżej przedstawiono przykład skryptu w języku Python, który usuwa nieoznakowane obrazy:

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)

W odpowiedzi otrzymasz listę usuniętych obrazów wraz z informacją o ewentualnych błędach.

Automatyczne usuwanie obrazów ECR

Zarządzanie AWS ECR może być czasochłonne, jeśli polegamy na ręcznym usuwaniu obrazów. Chociaż skrypty i polecenia ułatwiają proces, lepszym rozwiązaniem jest automatyzacja. AWS ECR oferuje zasady cyklu życia, które pozwalają na automatyczne usuwanie obrazów na podstawie zdefiniowanych kryteriów. Zobaczmy, jak to zrobić.

Metoda 1: Interfejs Graficzny (GUI)

Krok 1: Przejdź do repozytorium, dla którego chcesz ustawić zasady cyklu życia. W menu po lewej stronie znajdź opcję „Zasady cyklu życia”.

Krok 2: Kliknij „Utwórz regułę”, aby rozpocząć definiowanie zasad.

Krok 3: ECR umożliwia usuwanie obrazów na podstawie dwóch głównych kryteriów: wieku obrazu (liczonego w dniach) lub na podstawie statusu tagowania (czy obraz jest otagowany, czy nie). W konfiguracji można określić, ile dni obrazy mają być przechowywane lub ile nieoznakowanych obrazów ma być zachowanych. Dostosuj te parametry do swoich potrzeb i zapisz.

Metoda 2: Interfejs Wiersza Poleceń (CLI)

Do ustawiania zasad cyklu życia za pomocą CLI używamy polecenia „put-lifecycle-policy”. Aby je skonfigurować, należy utworzyć plik JSON zawierający definicję zasad. Oto opis kluczowych elementów takiej polityki:

rulePriority (Typ: liczba całkowita, Wymagane: tak):

Określa priorytet reguł w kolejności od najniższego do najwyższego. Reguły z priorytetem 1 są stosowane jako pierwsze, następnie 2 itd. Każda reguła musi mieć unikalną wartość priorytetu.

description (Typ: string, Wymagane: nie):

Opisuje cel reguły w polityce cyklu życia.

tagStatus (Typ: string, Wymagane: tak):

Określa, czy reguła dotyczy obrazów otagowanych, nieotagowanych, czy wszystkich. Jeśli status jest ustawiony na „otagowane”, należy podać „tagPrefixList”. W przypadku „nieotagowane”, „tagPrefixList” należy pominąć.

tagPrefixList (Typ: list[string], Wymagane: tak, tylko jeśli tagStatus jest ustawiony na tagged):

Lista prefiksów tagów oddzielonych przecinkami. Na przykład, prefiks „prod” obejmie obrazy z tagami „prod”, „prod1”, „prod2” itd.

countType (Typ: string, Wymagane: tak):

Określa, czy usuwanie obrazów ma być oparte na liczbie obrazów („imageCountMoreThan”) czy na ich wieku („sinceImagePushed”).

countUnit (Typ: string, Wymagane: tak, tylko jeśli countType jest ustawione na sinceImagePushed):

Jednostka czasu, gdy „countType” jest ustawione na „sinceImagePushed” (np. „dni”, „tygodnie”).

countNumber (Typ: liczba całkowita, Wymagane: tak):

Liczba, która zależy od „countType”. Jeśli „countType” to „imageCountMoreThan”, „countNumber” określa maksymalną liczbę obrazów do zachowania. Jeśli „countType” to „sinceImagePushed”, „countNumber” określa maksymalny wiek obrazu.

type (Typ: string, Wymagane: tak):

Rodzaj akcji, którą chcemy wykonać, np. „expire” (usuń obraz).

Przykładowy plik „policy.json”:

{
"rules": [
    {
        "rulePriority": 1,
        "description": "Usuń obrazy starsze niż 14 dni",
        "selection": {
            "tagStatus": "untagged",
            "countType": "sinceImagePushed",
            "countUnit": "days",
            "countNumber": 14
        },
        "action": {
            "type": "expire"
        }
    }
  ]
}

Powyższa polityka usuwa nieotagowane obrazy starsze niż 14 dni. Polecenie CLI do zastosowania tej zasady to:

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

Metoda 3: Skryptowanie

Możemy użyć biblioteki boto3 w Pythonie do ustawienia zasad cyklu życia. Poniższy kod pokazuje, jak to zrobić, wykorzystując ten sam plik „policy.json”:

import boto3

client = boto3.client('ecr')

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

print(response)

Jak zastosować politykę w wielu repozytoriach ECR?

Często zachodzi potrzeba zastosowania tych samych zasad w wielu repozytoriach. Ręczne ustawianie polityk w każdym repozytorium jest żmudne. Poniżej znajduje się przykład skryptu, który można wykorzystać do zastosowania jednej polityki w wielu repozytoriach:

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)

Podsumowanie

Automatyzacja zarządzania obrazami kontenerów w Amazon ECR jest niezbędna dla zachowania porządku i optymalizacji kosztów. Zastosowanie zasad cyklu życia pozwala na łatwe i efektywne usuwanie przestarzałych i nieużywanych obrazów, co przekłada się na lepsze zarządzanie zasobami AWS. AWS dostarcza bogatą dokumentację i wiele przykładów polityk, co umożliwia dopasowanie zasad do indywidualnych potrzeb. Zachęcamy do eksperymentowania z różnymi kryteriami i terminami usuwania obrazów, aby znaleźć optymalne rozwiązanie dla swojego środowiska. Zapoznanie się z kluczowymi terminami AWS również ułatwi naukę i efektywne wykorzystanie możliwości, jakie oferuje platforma.


newsblog.pl