Як видалити AWS ECR без тегів і старіші зображення?

Amazon ECR інтегровано з Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) і AWS Lambda, що спрощує ваш робочий процес від розробки до виробництва.

Amazon ECR розміщує зображення в масштабованій і доступній архітектурі, що дозволяє надійно розгортати контейнери для ваших програм. Важливо видаляти немарковані та старі зображення для підтримки гігієни.

Сьогодні програми працюють як мікросервіси. Термін «мікро-сервіс» — це не що інше, як контейнер, який упаковує весь код і його залежності, щоб програма могла працювати швидко та надійно в будь-якому обчислювальному середовищі. Завдяки своїй мобільності, невеликому розміру та зручності контейнери стають методом вибору для транспортування сучасних додатків.

Контейнери розроблені на основі шаблону, доступного лише для читання, який називається зображенням. Ці зображення потрібно десь зберігати, щоб їх могла отримати будь-яка машина, авторизована для їх використання.

Ось де на допомогу приходить реєстр контейнерів. Не так давно люди використовували DockerHub для зберігання цих зображень і артефактів. Але якщо ви використовуєте хмарні сервіси AWS, я впевнений, що ви вже використовуєте AWS ECR, який є альтернативою DockerHub.

AWS ECR — це повністю керований реєстр контейнерів, який забезпечує високопродуктивний хостинг, дозволяючи розгортати образи додатків і артефакти у формі публічних і приватних сховищ.

Щодня кілька додатків, розміщених на AWS, надсилають і завантажують мільйони зображень/артефактів додатків у певні репозиторії ECR або з них.

У цій статті ми обговоримо, як очистити старі та застарілі AWS ECR і підтримувати чисті репозиторії ECR.

Потреба: видаліть незазначені та старі зображення зараз!

Основною причиною очищення сховищ ECR є гігієна розробки. У будь-який час ніхто не захоче зберігати зображення старше десяти розгортань у своїх ECR. Це також тому, що відкоти часто трапляються в галузі, але відкат, який скасовує зміни з 5 артефактів раніше, трапляється рідко.

Простіше кажучи, будь-які зображення/артефакти, створені більше п’яти разів, марні. Це може бути змінено у звіті про стратегію вашої організації, але ми не рекомендуємо це як найкращу практику.

У всій галузі теги використовуються для визначення найстабільніших останніх або останніх п’яти останніх зображень. Як частина життєвого циклу розробки програмного забезпечення, зображення генеруються швидко, і ці теги замінюються новими зображеннями, залишаючи старі зображення непозначеними та марними.

У подібних ситуаціях, коли зображення/артефакти великі, це також додасть плату за зберігання на ECR. Ціна AWS ECR становить «0,10 доларів США за ГБ на місяць для даних, що зберігаються в приватних або публічних сховищах».

Можливо, ця ціна здасться вам невеликою, але, як кажуть, з крапель складається океан. Усі ці зображення, якщо зберігати їх на довший період, призведуть до збільшення рахунків у ваших рахунках AWS.

Пропозиція полягає в тому, щоб видалити ці старі та немарковані зображення зі сховищ ECR, оскільки вони вам не потрібні! просто! Навіщо це зберігати і платити за це?

Видалення зображень AWS ECR вручну

Спосіб 1: Шлях GUI!

Крок 1: увійдіть в обліковий запис Amazon Web Services і перейдіть до сховища, яке потрібно очистити.

Крок 2. Тут ви можете побачити, що репозиторій має останній тег, який визначає найстабільнішу версію. Інші теги, які ви бачите, можна назвати без тегів. Щоб видалити, нам просто потрібно вибрати зображення та натиснути кнопку «Видалити».

Крок 3. Підтвердьте видалення

Спосіб 2: шлях CLI!

Щоб видалити зображення за допомогою CLI, вам знадобляться всі ключі доступу до AWS IAM, налаштовані на вашій машині, і необхідний дозвіл IAM, щоб надати вам доступ до репозиторіїв.

У цьому випадку ми його вже налаштували. Ви можете зробити це в посібнику з основних налаштувань AWS, якщо ви цього ще не зробили.

Якщо ви не впевнені, що ви налаштували AWS CLI на своїй машині, скористайтеся такою командою, щоб перевірити.

aws sts get-caller-identity

Тепер, коли ми підтвердили, що можемо використовувати AWS CLI, ви можете скористатися такою командою, щоб видалити зображення ECR без тегів.

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

Тут ми робимо щось подібне до того, що ми робили в GUI. Ми видалимо зображення, позначене тегом custom-image-6, яке знаходиться в сховищі test-ecr-policy.

Спосіб 3: сценарій!

Необхідною умовою для цього методу є наявність ключа доступу до AWS, налаштованого на машині, на якій ви працюєте.

Скрипт для видалення зображень без тегів.

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)

Відповідь надасть вам список ідентифікаторів видалених зображень разом із помилкою, якщо така була.

Метод планування видалення зображень ECR

Якщо ви є інженером DevOps або регулярно керуєте AWS ECR, ви вже знаєте, як важко видаляти ці зображення вручну.

Запуск сценарію/команди справді полегшує роботу, але ми впевнені, що ви хотіли б мати щось, що автоматично видаляло б ці зображення самостійно, не турбуючись про них.

Хороші новини, AWS ECR пропонує політику життєвого циклу для ваших зображень, яку ви можете налаштувати, щоб видаляти ці зображення своєчасно або за розкладом. Давайте подивимося, як це зробити.

Спосіб 1: Шлях GUI!

Крок 1: перейдіть до сховища, де ви хочете встановити політику життєвого циклу. На лівій панелі ви можете побачити політику життєвого циклу. Ви можете натиснути на нього, щоб почати.

Крок 2: Ви можете натиснути на нього та створити своє перше правило.

Крок 3: ECR дозволяє видаляти зображення за двох умов, одна з яких полягає в тому, що ваші зображення вийшли за вказані дні або якщо вони позначені/не позначені, і ви хочете зберігати їх лише протягом, скажімо, X днів.

Давайте подивимося, як це робиться. Тепер ви можете вибрати, чи потрібно видаляти зображення без тегів, якщо вони один день або більше, або якщо кількість зображень без тегів перевищує одиницю.

Виберіть відповідно до вашого випадку використання. Не забувайте; ви можете збільшити ці числа до числа на свій вибір. Збережіть, щоб активувати правило життєвого циклу.

Спосіб 2: шлях CLI!

Команда AWS ECR CLI для встановлення політики життєвого циклу – put-lifecycle-policy.

Давайте подивимося, як це зробити. Для цього потрібно створити файл JSON із переліком умов політики. Ви можете назвати його policy.json або будь-яку назву на ваш вибір.

Але перед цим давайте розглянемо елементи політики життєвого циклу.

rulePriority (Type: integer, Required: yes):

Порядок правил від нижчого до вищого. Спочатку застосовуються правила політики життєвого циклу з пріоритетом один, потім 2 тощо. Кожне правило політики життєвого циклу має мати унікальне значення правила.

Правила політики не потребують послідовних значень. Будь-які правила з тегами повинні мати найвищий пріоритет правила та переглядатися останніми.

description (Type: string, Required: no):

Пояснює, для чого призначене правило в політиці життєвого циклу.

tagStatus (Type: string, Required: yes):

Він перевіряє, чи додане правило політики життєвого циклу визначає тег зображення. З тегами, без тегів або будь-яким іншим. Якщо нічого не вказано, оцінюються всі зображення. Для тегів потрібне значення tagPrefixList. Untagged вимагає пропуску tagPrefixList.

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

Якщо «tagStatus» має значення «tagged», ваша політика життєвого циклу вимагає розділених комами списку префіксів тегів зображень.

Використовуючи префікс тегу prod, ви можете вказати всі зображення, позначені prod, prod1, prod2 тощо. Кілька тегів вибирають лише зображення з усіма тегами.

countType (Type: string, Required: yes):

Укажіть countNumber, якщо countType має значення imageCountMoreThan, щоб обмежити кількість зображень у вашому сховищі.

Укажіть countUnit і countNumber, якщо countType має значення SinceImagePushed, щоб обмежити зображення репозиторію.

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

Указуйте одиницю підрахунку лише тоді, коли countType має значення SinceImagePushed; інакше виникає помилка.

countNumber (Type: integer, Required: yes):

Лише додатні цілі числа (0 не є прийнятним значенням). Якщо countType має значення imageCountMoreThan, це значення є максимальною кількістю фотографій для збереження. Використання SinceImagePushed як countType визначає максимальний вік зображення.

 type (Type: string, Required: yes):

Виберіть тип дії. Можна використовувати значення «термін дії».

Ось мій «policy.json».

{

"rules": [

{

"rulePriority": 1,

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

"selection": {

"tagStatus": "untagged",

"countType": "sinceImagePushed",

"countUnit": "days",

"countNumber": 14

},

"action": {

"type": "expire"

}

}

]

}

Відповідно до вимог вашої організації. «SinceImagePushed» можна замінити на «imageCountMoreThan».

Команда CLI для встановлення цієї політики буде такою:

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

Спосіб 3: сценарій!

Для цього ми будемо використовувати команду boto3. Ми можемо використовувати той самий «policy.json», щоб налаштувати це. Нижче наведено використаний фрагмент коду.

import boto3

client = boto3.client('ecr')

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

print(response)

Як застосувати єдину політику до кількох сховищ ECR?

Часто виникають запитання щодо того, як застосувати одну політику до кількох сховищ.

Встановлювати політики вручну – це повторюване та нудне завдання.

Ось фрагмент коду, який можна використовувати у робочій системі для застосування політики до понад 100 сховищ.

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)

Висновок

Ми можемо легко створити політику життєвого циклу ECR і знищити старіші зображення відповідно до вказаних параметрів. AWS надає розширену документацію, а також зразки політик життєвого циклу.

Ви також можете поекспериментувати з альтернативними правилами для зображень із тегами, як-от зіставлення критеріїв із датою завантаження зображення.

Ви також можете ознайомитися з деякими ключовими термінологіями AWS, які сприяють вашому навчанню AWS.