Jak usunąć nieoznakowane i starsze obrazy AWS ECR?

Amazon ECR jest zintegrowany z Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) i AWS Lambda, co upraszcza proces tworzenia i produkcji.

Amazon ECR obsługuje obrazy w wysoce skalowalnej i dostępnej architekturze, co pozwala na niezawodne wdrażanie kontenerów dla aplikacji. Aby zachować higienę, należy usuwać nieoznakowane i stare obrazy.

Dziś aplikacje działają jako mikrousługi. Termin mikrousługa to nic innego jak kontener, który pakuje cały kod i jego zależności, dzięki czemu aplikacja może działać szybko i niezawodnie w dowolnym środowisku obliczeniowym. Ze względu na ich przenośność, niewielkie rozmiary i wygodę, kontenery stają się preferowaną metodą wysyłki nowoczesnych aplikacji.

Kontenery są projektowane na podstawie szablonu tylko do odczytu zwanego obrazem. Te obrazy muszą być gdzieś przechowywane, aby mogły być odzyskane przez dowolną maszynę upoważnioną do ich używania.

Tu właśnie pojawia się rejestr kontenerów. Nie tak dawno ludzie używali DockerHub do przechowywania tych obrazów i artefaktów. Ale jeśli korzystasz z usług chmurowych AWS, jestem pewien, że korzystasz już z AWS ECR, który jest alternatywą dla DockerHub.

AWS ECR to w pełni zarządzany rejestr kontenerów, który zapewnia wysokowydajny hosting, umożliwiający wdrażanie obrazów aplikacji i artefaktów w postaci publicznych i prywatnych repozytoriów.

Każdego dnia wiele aplikacji hostowanych przez AWS wysyła i pobiera miliony obrazów/artefaktów aplikacji do/z określonych repozytoriów ECR.

W tym artykule omówimy, jak wyczyścić stare i przestarzałe AWS ECR i utrzymać repozytoria ECR w czystości.

Potrzeba: Usuń nieoznaczone i stare obrazy już teraz!

Podstawowym powodem czyszczenia repozytoriów ECR jest higiena rozwoju. W żadnym momencie nikt nie chciałby przechowywać w swoich ECR obrazów starszych niż dziesięć wdrożeń. Dzieje się tak również dlatego, że w branży często zdarzają się wycofania, ale wycofanie, które cofa zmianę z 5 wcześniejszych artefaktów, jest rzadkie.

Mówiąc prościej, wszelkie obrazy/artefakty starsze niż pięć wdrożeń są bezużyteczne. Może ulec zmianie w raporcie strategii Twojej organizacji, ale nie zalecamy tego jako najlepszej praktyki.

W całej branży tagowanie służy do określania najbardziej stabilnych najnowszych lub ostatnich pięciu najnowszych obrazów. W ramach cyklu życia oprogramowania, obrazy są generowane szybko, a znaczniki te są zastępowane nowymi obrazami, pozostawiając starsze obrazy nieoznakowane i bezużyteczne.

W takich sytuacjach, gdy obrazy/artefakty są duże, doda to również opłaty za przechowywanie w ECR. Cena AWS ECR wynosi „0,10 USD za GB / miesiąc za dane przechowywane w prywatnych lub publicznych repozytoriach”.

Ta cena może wydawać się niewielka, ale jak mówią, krople tworzą ocean. Wszystkie te obrazy, jeśli będą przechowywane przez dłuższy czas, dodadzą wyższych rachunków do Twoich faktur AWS.

Sugeruje się usunięcie tych starych i nieoznakowanych obrazów z repozytoriów ECR, ponieważ ich nie potrzebujesz! Prosty! Po co go trzymać i za to płacić?

Ręczne usuwanie obrazów AWS ECR

Metoda 1: Sposób GUI!

Krok 1: Zaloguj się na konto Amazon Web Services i przejdź do repozytorium, które chcesz wyczyścić.

Krok 2: Tutaj możesz zobaczyć, że repozytorium ma najnowszy tag, aby określić najbardziej stabilną wersję. Inne widoczne tagi można nazwać nieoznaczonymi. Aby usunąć, wystarczy wybrać obraz i kliknąć usuń.

Krok 3: Potwierdź usunięcie

Metoda 2: Sposób CLI!

Aby usunąć obraz za pomocą interfejsu wiersza polecenia, będziesz potrzebować wszystkich kluczy dostępu AWS IAM skonfigurowanych na komputerze oraz wymaganego uprawnienia IAM umożliwiającego dostęp do repozytoriów.

W tym przypadku już to skonfigurowaliśmy. Możesz to zrobić z przewodnika po konfiguracji AWS, jeśli jeszcze tego nie zrobiłeś.

Jeśli nie masz pewności, czy skonfigurowałeś interfejs AWS CLI na swoim komputerze, użyj następującego polecenia, aby zweryfikować.

aws sts get-caller-identity

Teraz, gdy potwierdziliśmy, że możemy korzystać z interfejsu AWS CLI, możesz użyć następującego polecenia, aby usunąć nieoznakowany obraz ECR.

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

Tutaj robimy coś podobnego do tego, co zrobiliśmy w GUI. Usuniemy obraz oznaczony jako custom-image-6 znajdujący się w repozytorium test-ecr-policy.

Metoda 3: Sposób Skryptowania!

Warunkiem wstępnym dla tej metody jest skonfigurowanie klucza dostępu AWS na komputerze, na którym pracujesz.

Skrypt do usuwania nieoznakowanych obrazów.

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 identyfikatorów obrazów wraz z ewentualnym niepowodzeniem.

Metoda planowania usuwania obrazów ECR

Jeśli jesteś inżynierem DevOps lub regularnie zarządzasz AWS ECR, już wiesz, jak trudne jest ręczne usuwanie tych obrazów.

Uruchamianie skryptu/polecenia znacznie ułatwia sprawę, ale jesteśmy pewni, że chciałbyś mieć coś, co samoczynnie usunęłoby te obrazy bez konieczności martwienia się o nie.

Dobra wiadomość, AWS ECR oferuje zasady cyklu życia dla twoich obrazów, które możesz ustawić tak, aby usuwać te obrazy w odpowiednim czasie lub zgodnie z harmonogramem. Zobaczmy, jak to zrobić.

Metoda 1: Sposób GUI!

Krok 1: Udaj się do repozytorium, w którym chcesz ustawić zasady cyklu życia. W lewym panelu możesz zobaczyć zasady cyklu życia. Możesz go kliknąć, aby rozpocząć.

Krok 2: Możesz go kliknąć i utworzyć pierwszą regułę.

Krok 3: ECR pozwala na usunięcie obrazów pod dwoma warunkami, po pierwsze, jeśli obrazy mają określone dni lub są oznaczone/nieoznaczone, a chcesz je zachować tylko przez, powiedzmy, X dni.

Zobaczmy, jak to się robi. Teraz możesz określić, czy chcesz usunąć nieoznaczone obrazy, jeśli mają co najmniej jeden dzień lub jeśli liczba nieoznaczonych obrazów przekracza jeden.

Wybierz zgodnie ze swoim przypadkiem użycia. Nie zapomnij; możesz zwiększyć te liczby do wybranej przez siebie liczby. Zapisz, aby uruchomić regułę cyklu życia.

Metoda 2: Sposób CLI!

Polecenie AWS ECR CLI do ustawiania zasad cyklu życia to put-lifecycle-policy.

Zobaczmy, jak to zrobić. W tym celu musisz utworzyć plik JSON z listą warunków zasad. Możesz nazwać go policy.json lub dowolną wybraną nazwą.

Ale wcześniej spójrzmy na elementy polityki cyklu życia.

rulePriority (Type: integer, Required: yes):

Kolejność reguł od niższej do wyższej. Reguły zasad cyklu życia o priorytecie jeden są stosowane jako pierwsze, potem 2 itd. Każda z reguł zasad cyklu życia musi mieć unikalną wartość reguły.

Reguły polityki nie wymagają kolejnych wartości. Wszelkie otagowane reguły muszą mieć najwyższy priorytet reguły i być sprawdzane jako ostatnie.

description (Type: string, Required: no):

Wyjaśnia, do czego służy reguła w polityce cyklu życia.

tagStatus (Type: string, Required: yes):

Sprawdza, czy dodana reguła zasad cyklu życia określa tag obrazu. Oznaczone, nieoznaczone lub dowolne jest OK. Jeśli nie określono żadnego, oceniane są wszystkie obrazy. Tagged wymaga wartości tagPrefixList. Nieoznakowane wymaga pominięcia tagPrefixList.

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

Jeśli „tagStatus” jest „otagowany”, zasady cyklu życia wymagają listy rozdzielonych przecinkami prefiksów tagów graficznych.

Używając przedrostka tagu prod, możesz określić wszystkie obrazy oznaczone jako prod, prod1, prod2 itd. Wiele tagów wybiera tylko obrazy ze wszystkimi tagami.

countType (Type: string, Required: yes):

Określ countNumber, jeśli countType to imageCountMoreThan, aby ograniczyć liczbę obrazów w repozytorium.

Określ countUnit i countNumber, jeśli countType jest odImagePushed, aby ograniczyć obrazy repozytorium.

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

Podaj jednostkę liczby tylko wtedy, gdy countType jest odImagePushed; w przeciwnym razie wystąpi błąd.

countNumber (Type: integer, Required: yes):

Tylko dodatnie liczby całkowite (0 nie jest akceptowaną wartością). Jeśli countType to imageCountMoreThan, wartością jest maksymalna liczba zdjęć do zachowania. Użycie sinceImagePushed jako countType określa maksymalny wiek obrazu.

 type (Type: string, Required: yes):

Wybierz rodzaj działania. Wartość, której można użyć, to „wygasa”.

Oto moja „policy.json”.

{

"rules": [

{

"rulePriority": 1,

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

"selection": {

"tagStatus": "untagged",

"countType": "sinceImagePushed",

"countUnit": "days",

"countNumber": 14

},

"action": {

"type": "expire"

}

}

]

}

Zgodnie z wymaganiami Twojej organizacji. „SinceImagePushed” można zastąpić „imageCountMoreThan”.

Polecenie CLI do ustawienia tej zasady to:

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

Metoda 3: Sposób Skryptowania!

Aby to osiągnąć, użyjemy polecenia boto3. Możemy użyć tego samego „policy.json”, aby to ustawić. Poniżej znajduje się użyty fragment kodu.

import boto3

client = boto3.client('ecr')

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

print(response)

Jak zastosować jedną politykę w wielu repozytoriach ECR?

Często pojawiają się pytania, jak zastosować te same zasady w wielu repozytoriach.

Ręczne ustawianie polityk to powtarzające się i nudne zadanie.

Oto fragment kodu, którego można użyć w systemie produkcyjnym do zastosowania zasad w ponad 100 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)

Wniosek

Możemy łatwo skonstruować politykę cyklu życia ECR i zniszczyć starsze obrazy zgodnie z określonymi parametrami. AWS dostarcza obszerną dokumentację, a także przykłady polityk dotyczących cyklu życia.

Możesz także poeksperymentować z alternatywnymi zasadami dotyczącymi otagowanych obrazów, takimi jak dopasowanie kryteriów do daty przesłania obrazu.

Możesz również zapoznać się z niektórymi kluczowymi terminologiami AWS, które polepszają Twoją naukę AWS.