Hur tar man bort AWS ECR otaggade och äldre bilder?

Amazon ECR är integrerad med Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) och AWS Lambda, vilket förenklar din utveckling till produktionsarbetsflöde.

Amazon ECR är värd för bilderna i en mycket skalbar och tillgänglig arkitektur, vilket gör att du kan distribuera behållare på ett tillförlitligt sätt för dina applikationer. Det är viktigt att radera otaggade och gamla bilder för att upprätthålla hygienen.

Idag körs applikationer som mikrotjänster. Termen mikrotjänst är inget annat än en behållare som paketerar all kod och dess beroenden så att applikationen kan köras snabbt och tillförlitligt i vilken datormiljö som helst. På grund av deras portabilitet, ringa storlek och bekvämlighet, blir containrar en valmetod för transport av moderna applikationer.

Behållare är designade från en skrivskyddad mall som kallas en bild. Dessa bilder måste lagras någonstans så att de kan hämtas av vilken maskin som helst som är behörig att använda dem.

Det är där ett containerregister kommer in. För inte så länge sedan använde folk DockerHub för att lagra dessa bilder och artefakter. Men om du använder AWS molntjänster är jag säker på att du redan använder AWS ECR, som är ett alternativ till DockerHub.

AWS ECR är ett fullständigt hanterat containerregister som tillhandahåller högpresterande hosting, så att du kan distribuera applikationsbilder och artefakter i form av offentliga och privata arkiv.

Varje dag trycker och drar flera AWS-värdade applikationer miljontals bilder/applikationsartefakter in i/ut ur specifika ECR-arkiv.

I den här artikeln kommer vi att diskutera hur man rensar gamla och föråldrade AWS ECR och håller ECR-lager rena.

Behovet: Ta bort otaggade och gamla bilder nu!

Det främsta skälet till att rengöra ECR-förvar är utvecklingshygien. Ingen skulle när som helst vilja behålla bilder som är äldre än tio distributioner i sina ECR. Det beror också på att återställningar ofta sker i branschen, men en återställning som återställer förändringen från 5 artefakter tidigare är sällsynt.

I enklare termer är alla bilder/artefakter som är äldre än fem installationer värdelösa. Det kan komma att ändras i din organisations strategirapport, men vi skulle inte rekommendera det som en bästa praxis.

Över hela branschen används taggning för att specificera de mest stabila senaste eller senaste fem senaste bilderna. Som en del av livscykeln för mjukvaruutveckling genereras bilderna snabbt och dessa taggar ersätts med nya bilder, vilket lämnar de äldre bilderna otaggade och oanvändbara.

I situationer som denna, där bilder/artefakter är stora, kommer det också att lägga till lagringsavgifter på ECR. Priset för AWS ECR är ”$0,10 per GB / månad för data som lagras i privata eller offentliga arkiv”.

Det här priset kan se lite ut för dig, men som de säger, droppar utgör havet. Alla dessa bilder, om de lagras under en längre period, kommer att lägga till högre räkningar på dina AWS-fakturor.

Förslaget är att rensa bort dessa gamla och otaggade bilder från dina ECR-förråd eftersom du inte behöver dem! Enkel! Varför behålla den och betala för den?

Radera AWS ECR-bilder manuellt

Metod 1: The GUI Way!

Steg 1: Logga in på Amazon Web Services-kontot och gå till arkivet du vill rensa.

Steg 2: Här kan du se att förvaret har den senaste taggen för att ange den mest stabila versionen. De andra taggarna som du ser kan kallas otaggade. För att radera behöver vi bara välja bilden och klicka på ta bort.

Steg 3: Bekräfta att ta bort

Metod 2: The CLI Way!

För att radera en bild med hjälp av CLI behöver du alla AWS IAM-åtkomstnycklar som är konfigurerade på din dator och den nödvändiga IAM-behörigheten för att ge dig åtkomst till förvaret.

I det här fallet har vi redan konfigurerat det. Du kan göra det från AWS-konfigurationsguiden om du inte redan har gjort det.

Om du är osäker på att du har konfigurerat AWS CLI på din maskin, använd följande kommando för att verifiera.

aws sts get-caller-identity

Nu när vi har bekräftat att vi kan använda AWS CLI kan du använda följande kommando för att radera en omärkt ECR-bild.

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

Här gör vi något liknande det vi gjorde i GUI. Vi kommer att ta bort bilden taggad som custom-image-6 som finns i repository test-ecr-policy.

Metod 3: The Scripting Way!

Förutsättningen för den här metoden är att ha en AWS Access-nyckel konfigurerad i maskinen du kör på.

Skript för att radera otaggade bilder.

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)

Svaret skulle ge dig en lista över raderade bild-ID:n, tillsammans med ett misslyckande om det fanns några.

Schemaläggningsmetod för att ta bort ECR-bilder

Om du är en DevOps-ingenjör eller regelbundet hanterar AWS ECR, kommer du redan att känna till smärtan med att radera dessa bilder manuellt.

Att köra skriptet/kommandot gör det lättare, men vi är säkra på att du skulle ha önskat något som automatiskt skulle ta bort dessa bilder på egen hand utan att du behöver oroa dig för dem.

Goda nyheter, AWS ECR erbjuder en livscykelpolicy för dina bilder, som du kan ställa in för att radera dessa bilder i tid eller schemalagt. Låt oss se hur man gör det.

Metod 1: The GUI Way!

Steg 1: Gå över till arkivet där du vill ställa in livscykelpolicyn. På den vänstra panelen kan du se livscykelpolicyn. Du kan klicka på den för att komma igång.

Steg 2: Du kan klicka på den och skapa din första regel.

Steg 3: ECR låter dig ta bort bilder på två villkor, det ena är om dina bilder blir angivna dagar gamla eller om de är taggade/otaggade och du bara vill behålla dem i, till exempel, X antal dagar.

Låt oss se hur det görs. Nu kan du ställa in om du vill radera otaggade bilder om de är en dag eller äldre eller om bildantalet för otaggade bilder överstiger en.

Välj efter ditt användningsfall. Glöm inte; du kan öka dessa siffror till det antal du väljer. Spara för att utlösa livscykelregeln.

Metod 2: The CLI Way!

AWS ECR CLI-kommandot för att ställa in livscykelpolicy är put-lifecycle-policy.

Låt oss se hur man gör det. För detta måste du skapa en JSON-fil som visar policyvillkoren. Du kan döpa den till policy.json eller valfritt namn.

Men innan dess, låt oss titta på de livscykelpolitiska elementen.

rulePriority (Type: integer, Required: yes):

Lägre till högre regelordning. Livscykelpolicyregler med prioritet ett tillämpas först, sedan 2 osv. Livscykelpolicyregler måste var och en ha ett unikt regelvärde.

Policyregler behöver inte på varandra följande värden. Alla taggade regler måste ha högsta regelPrioritet och granskas sist.

description (Type: string, Required: no):

Förklarar vad en regel i en livscykelpolicy är till för.

tagStatus (Type: string, Required: yes):

Den kontrollerar om den tillagda livscykelpolicyregeln anger en bildtagg. Taggad, otaggad eller något är OK. Om ingen anges utvärderas alla bilder. Tagged kräver ett tagPrefixList-värde. Otaggat kräver att tagPrefixList utelämnas.

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

Om ”tagStatus” är ”taggad” kräver din livscykelpolicy en kommaseparerad lista med bildtaggsprefix.

Med hjälp av taggprefixet prod kan du ange alla bilder märkta prod, prod1, prod2, etc. Flera taggar plockar endast bilder med alla taggar.

countType (Type: string, Required: yes):

Ange countNumber om countType är imageCountMoreThan för att begränsa antalet bilder i ditt arkiv.

Ange countUnit och countNumber om countType är sinceImagePushed för att begränsa förvarets bilder.

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

Ange endast en räkneenhet när countType är sinceImagePushed; annars uppstår ett fel.

countNumber (Type: integer, Required: yes):

Endast positiva heltal (0 är inte ett accepterat värde). Om countType är imageCountMoreThan är värdet det maximala antalet fotografier att behålla. Att använda sinceImagePushed som countType bestämmer den maximala bildens ålder.

 type (Type: string, Required: yes):

Välj en typ av åtgärd. Värdet som kan användas är ”expire”.

Här är min ”policy.json.”

{

"rules": [

{

"rulePriority": 1,

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

"selection": {

"tagStatus": "untagged",

"countType": "sinceImagePushed",

"countUnit": "days",

"countNumber": 14

},

"action": {

"type": "expire"

}

}

]

}

Enligt din organisations krav. ”sinceImagePushed” kan ersättas med ”imageCountMoreThan”.

CLI-kommandot för att ställa in denna policy skulle vara:

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

Metod 3: The Scripting Way!

Vi kommer att använda kommandot boto3 för att uppnå detta. Vi kan använda samma ”policy.json” för att ställa in detta. Nedan finns det använda kodavsnittet.

import boto3

client = boto3.client('ecr')

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

print(response)

Hur tillämpar man en enda policy på flera ECR-arkiv?

Ofta finns det frågor om hur man tillämpar samma policy på flera arkiv.

Det är en repetitiv och tråkig uppgift att sätta policyer manuellt.

Här är ett kodavsnitt som kan användas i produktionssystemet för att tillämpa en policy över 100-tals+ förråd.

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)

Slutsats

Vi kan enkelt konstruera en ECR-livscykelpolicy och förstöra äldre bilder enligt de angivna parametrarna. AWS tillhandahåller omfattande dokumentation samt exempel på livscykelpolicyer.

Du kan också experimentera med alternativa policyer för taggade bilder, som att matcha kriterier med datumet då bilden laddades upp.

Du kan också utforska några AWS-nyckelterminologier som främjar ditt AWS-lärande.