Как удалить AWS ECR без тегов и старые изображения?

Опубликовано: 2022-09-07

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: Путь с графическим интерфейсом!

Шаг 1. Войдите в учетную запись Amazon Web Services и перейдите в репозиторий, который хотите очистить.

Шаг 2: Здесь вы можете видеть, что репозиторий имеет последний тег, указывающий самую стабильную версию. Другие теги, которые вы видите, можно назвать нетегированными. Чтобы удалить, нам просто нужно выбрать изображение и нажать «Удалить».

Шаг 3 : Подтвердите удаление

Способ 2: CLI Way!

Чтобы удалить образ с помощью интерфейса командной строки, вам потребуются все ключи доступа AWS IAM, настроенные на вашем компьютере, и необходимое разрешение IAM для доступа к репозиториям.

В данном случае мы уже настроили его. Это можно сделать из руководства по основам настройки AWS, если вы еще этого не сделали.

Если вы не уверены, настроили ли вы AWS CLI на своем компьютере, используйте следующую команду для проверки.

 aws sts get-caller-identity

Теперь, когда мы подтвердили, что можем использовать интерфейс командной строки AWS, вы можете использовать следующую команду для удаления непомеченного образа ECR.

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

Здесь мы делаем что-то похожее на то, что мы делали в графическом интерфейсе. Мы удалим изображение с тегом 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: Путь с графическим интерфейсом!

Шаг 1: Перейдите в репозиторий, где вы хотите установить политику жизненного цикла. На левой панели вы можете увидеть политику жизненного цикла. Вы можете нажать на нее, чтобы начать.

Шаг 2: Вы можете нажать на него и создать свое первое правило.

Шаг 3: ECR позволяет вам удалять изображения при двух условиях, одно из которых заключается в том, что вашим изображениям исполнилось определенное количество дней или если они помечены/не помечены, и вы хотите сохранить их только, скажем, в течение X дней.

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

Выберите в соответствии с вашим вариантом использования. Не забывайте; вы можете увеличить эти числа до числа по вашему выбору. Сохраните, чтобы активировать правило жизненного цикла.

Способ 2: CLI Way!

Команда интерфейса командной строки AWS ECR для установки политики жизненного цикла — put-lifecycle-policy.

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

Но перед этим давайте рассмотрим элементы политики жизненного цикла.

 rulePriority (Type: integer, Required: yes):

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

Правилам политики не нужны последовательные значения. Любые помеченные правила должны иметь наивысший приоритет правила и проверяться в последнюю очередь.

 description (Type: string, Required: no):

Объясняет, для чего предназначено правило в политике жизненного цикла.

 tagStatus (Type: string, Required: yes):

Он проверяет, указывает ли добавленное правило политики жизненного цикла тег изображения. Tagged, untagged или любой другой в порядке. Если ничего не указано, оцениваются все изображения. Tagged требуется значение tagPrefixList. Без тегов требуется опустить 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 имеет значение OnceImagePushed, чтобы ограничить количество изображений в репозитории.

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

Укажите единицу счета только в том случае, если countType имеет значение OnceImagePushed; в противном случае возникает ошибка.

 countNumber (Type: integer, Required: yes):

Только положительные целые числа (0 не является допустимым значением). Если countType имеет значение imageCountMoreThan, значением является максимальное количество сохраняемых фотографий. Использование сентимажепушед в качестве countType определяет максимальный возраст изображения.

 type (Type: string, Required: yes):

Выберите тип действия. Можно использовать значение «expire».

Вот мой «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.