Как да изтрия 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 артефакта по-рано, е рядко.

С по-прости думи, всяко изображение/артефакти, по-стари от пет внедрявания, са безполезни. Подлежи на промяна в стратегическия отчет на вашата организация, но не бихме го препоръчали като най-добра практика.

  8 страхотни XFCE теми за проверка

В цялата индустрия маркирането се използва за указване на най-стабилните най-нови или последните пет най-нови изображения. Като част от жизнения цикъл на разработка на софтуер, изображенията се генерират бързо и тези етикети се заменят с нови изображения, оставяйки по-старите изображения немаркирани и безполезни.

В ситуации като тази, когато изображенията/артефактите са големи, това също ще добави такси за съхранение на ECR. Цената на AWS ECR е „$0,10 на GB / месец за данни, съхранявани в частни или обществени хранилища“.

Тази цена може да ви изглежда малка, но както се казва, капките правят океана. Всички тези изображения, ако се съхраняват за по-дълъг период, ще добавят по-високи сметки към вашите 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)

Отговорът ще ви даде списък с изтрити идентификатори на изображения, заедно с неуспех, ако има такъв.

  6 инструмента за управление на мрежовата конфигурация за всичките ви устройства

Метод на планиране за изтриване на 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 и т.н. Всяко правило за политика за жизнения цикъл трябва да има уникална стойност на правило.

Правилата на правилата не се нуждаят от последователни стойности. Всички маркирани правила трябва да имат най-високия rulePriority и да се преглеждат последни.

description (Type: string, Required: no):

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

tagStatus (Type: string, Required: yes):

Той проверява дали добавеното правило за правилата за жизнения цикъл посочва етикет за изображение. Маркиран, немаркиран или всякакъв е ОК. Ако не е посочено нито едно, всички изображения се оценяват. Tagged изисква стойност на tagPrefixList. Untagged изисква пропускане на tagPrefixList.

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

Ако „tagStatus“ е „маркиран“, вашата политика за жизнения цикъл изисква разделен със запетаи списък с префикси на тагове за изображения.

  Как да активирате Crunchyroll на всяко устройство

Като използвате префикса на етикета 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):

Изберете вид действие. Стойността, която може да се използва, е „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.