Hantera dina behållarbilder i Amazon ECR
Amazon ECR (Elastic Container Registry) fungerar smidigt med tjänster som Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) och AWS Lambda. Denna integrering underlättar övergången från utveckling till produktionsmiljöer.
Med Amazon ECR lagras dina behållarbilder i en arkitektur som är både mycket skalbar och tillgänglig. Detta säkerställer att dina applikationer kan distribueras tillförlitligt. För att bibehålla en god ordning är det dock viktigt att regelbundet radera bilder som är otaggade eller gamla.
Moderna applikationer är ofta uppbyggda som mikrotjänster. En mikrotjänst är i grunden en behållare som innehåller all nödvändig kod och beroenden. Detta gör att applikationen kan köras snabbt och pålitligt i olika datormiljöer. Behållare är populära på grund av sin portabilitet, kompakta storlek och användarvänlighet, och blir alltmer det föredragna sättet att hantera moderna applikationer.
Behållare skapas från skrivskyddade mallar, så kallade bilder. Dessa bilder måste lagras på en central plats där de kan hämtas av behöriga enheter.
Här kommer ett behållarregister in i bilden. Tidigare användes ofta DockerHub för att lagra dessa bilder. Men för de som använder AWS molntjänster är AWS ECR ett vanligt alternativ.
AWS ECR är en fullt hanterad tjänst för lagring av behållarbilder. Den erbjuder högpresterande hosting och gör det möjligt att distribuera applikationsbilder och artefakter i både privata och publika arkiv.
Varje dag laddar många applikationer som körs på AWS upp och ner miljontals bilder till och från ECR-arkiven.
I den här artikeln kommer vi att utforska hur man kan rengöra gamla och föråldrade bilder i AWS ECR för att hålla lagringsutrymmet välordnat.
Varför är det viktigt att radera otaggade och gamla bilder?
Det främsta skälet till att rengöra ECR-arkiv är att upprätthålla en god utvecklingspraxis. Det är inte effektivt att behålla bilder som är äldre än ett visst antal distributioner. Återställningar görs ofta i branschen, men det är ovanligt att återställa ändringar som gjorts för mer än fem versioner sedan.
En generell riktlinje är att bilder och artefakter som är äldre än fem installationer inte längre är användbara. Det kan finnas justeringar i organisationens strategi, men detta rekommenderas som en god praxis.
Inom mjukvarubranschen används taggar för att identifiera de mest stabila eller senaste versionerna. Under utvecklingen av mjukvara genereras nya bilder löpande. När nya bilder publiceras, ersätts gamla taggar, vilket gör att de äldre bilderna blir otaggade och oanvändbara.
Om stora bilder lagras i onödan ökar också lagringskostnaderna. Priset för AWS ECR är ”$0,10 per GB/månad för data som lagras i privata eller publika arkiv”.
Även om det här priset kan verka lågt, kan det ackumuleras över tid om stora mängder gamla bilder sparas. Det är därför viktigt att rensa bort dessa onödiga bilder.
Det enkla svaret är: varför behålla och betala för något du inte behöver?
Manuell borttagning av AWS ECR-bilder
Metod 1: Genom det grafiska gränssnittet
Steg 1: Logga in på ditt Amazon Web Services-konto och navigera till det arkiv du vill rensa.
Steg 2: I arkivet ser du att den senaste versionen har en tagg. Andra taggar kan anses vara otaggade. För att ta bort en bild, välj den och klicka på ”Ta bort”.
Steg 3: Bekräfta borttagningen.
Metod 2: Genom kommandoraden (CLI)
För att radera en bild med kommandoraden behöver du AWS IAM-åtkomstnycklar konfigurerade på din dator, samt nödvändiga IAM-behörigheter.
Vi antar att detta redan är konfigurerat. Om inte, kan du använda AWS-konfigurationsguiden.
Om du är osäker på om AWS CLI är korrekt installerat, kan du använda följande kommando för att verifiera:
aws sts get-caller-identity
När du har bekräftat att AWS CLI fungerar, kan du använda följande kommando för att radera en otaggad 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 som i det grafiska gränssnittet. Vi tar bort bilden med taggen ”custom-image-6” från arkivet ”test-ecr-policy”.
Metod 3: Genom skript
För att använda den här metoden måste AWS-åtkomstnycklar vara konfigurerade på den dator du använder.
Här är ett exempel på ett skript som kan ta bort 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 ger en lista över raderade bild-ID:n, samt eventuella felmeddelanden.
Schemaläggning av borttagning av ECR-bilder
Om du jobbar med DevOps eller regelbundet hanterar AWS ECR, vet du hur tidskrävande det kan vara att radera bilder manuellt.
Att använda skript eller kommandon är en förbättring, men det vore idealiskt om processen vore automatiserad så att bilderna raderas utan att du behöver göra det manuellt.
Goda nyheter! AWS ECR erbjuder möjligheten att skapa livscykelpolicyer för dina bilder. Dessa kan automatiskt radera bilder enligt ett schema eller när specifika villkor uppfylls. Låt oss se hur det fungerar.
Metod 1: Genom det grafiska gränssnittet
Steg 1: Gå till arkivet där du vill konfigurera livscykelpolicyn. Klicka på ”Livscykelpolicy” i menyn till vänster för att komma igång.
Steg 2: Klicka på knappen för att skapa en ny regel.
Steg 3: ECR låter dig radera bilder baserat på två villkor: antingen när bilderna blir ett visst antal dagar gamla, eller om de är taggade/otaggade och du endast vill behålla dem under en viss tidsperiod.
Nu kan du ställa in om otaggade bilder ska raderas om de är en dag eller äldre, eller om antalet otaggade bilder överstiger en viss gräns.
Välj de alternativ som bäst passar dina behov. Kom ihåg att du kan ändra dessa siffror. Spara för att aktivera livscykelregeln.
Metod 2: Genom kommandoraden (CLI)
AWS ECR CLI-kommandot för att ställa in en livscykelpolicy är ”put-lifecycle-policy”.
För att göra detta måste du skapa en JSON-fil som definierar policyvillkoren. Du kan ge filen valfritt namn, till exempel ”policy.json”.
Låt oss först gå igenom de olika livscykelpolitiska elementen.
rulePriority (Typ: integer, Krävs: ja):
Regler tillämpas i prioriteringsordning, med lägre nummer först. Varje regel måste ha ett unikt värde.
Regler behöver inte ha sammanhängande värden. Taggade regler måste ha den högsta prioriteten och kontrolleras sist.
description (Typ: string, Krävs: nej):
Beskriver syftet med regeln.
tagStatus (Typ: string, Krävs: ja):
Anger om regeln ska tillämpas på taggade bilder. Möjliga värden är ”tagged”, ”untagged” eller ”any”. Om inget anges, utvärderas alla bilder. Om ”tagged” väljs, måste ett tagPrefixList-värde anges. ”Untagged” kräver att tagPrefixList utelämnas.
tagPrefixList (Typ: list[string], Krävs: ja, endast om tagStatus är satt till "tagged"):
Om ”tagStatus” är satt till ”tagged” ska en kommaseparerad lista med taggprefix anges.
Med prefixet ”prod” matchar du bilder med taggarna ”prod”, ”prod1”, ”prod2” osv. Flera taggar matchar endast bilder med alla taggar.
countType (Typ: string, Krävs: ja):
Använd ”imageCountMoreThan” för att begränsa antalet bilder i arkivet. Ange ”countUnit” och ”countNumber” om ”countType” är ”sinceImagePushed” för att begränsa bildernas ålder.
countUnit (Typ: string, Krävs: ja, endast om countType är satt till "sinceImagePushed"):
Ange enheten endast när ”countType” är ”sinceImagePushed”. Annars uppstår ett fel.
countNumber (Typ: integer, Krävs: ja):
Endast positiva heltal (0 är inte ett accepterat värde). Om ”countType” är ”imageCountMoreThan” är värdet det maximala antalet bilder som ska behållas. Om ”sinceImagePushed” används som ”countType”, bestäms den maximala åldern.
type (Typ: string, Krävs: ja):
Välj typ av åtgärd. Värdet som kan användas är ”expire”.
Här är ett exempel på filen ”policy.json”:
{ "rules": [ { "rulePriority": 1, "description": "Expire images older than 10 days", "selection": { "tagStatus": "untagged", "countType": "sinceImagePushed", "countUnit": "days", "countNumber": 14 }, "action": { "type": "expire" } } ] }
Anpassa efter din organisations behov. ”sinceImagePushed” kan ersättas med ”imageCountMoreThan”.
CLI-kommandot för att ställa in denna policy är:
aws ecr put-lifecycle-policy --repository-name "test-ecr-polict" --lifecycle-policy-text "file://policy.json"
Metod 3: Genom skript
Vi kommer att använda boto3 för att göra detta. Vi kan använda samma ”policy.json”-fil. Nedan finns ett kodexempel:
import boto3 client = boto3.client('ecr') response = client.put_lifecycle_policy( registryId='PODES12342', repositoryName="test-ecr-policy", lifecyclePolicyText="plicy.json" ) print(response)
Hur appliceras en enda policy på flera ECR-arkiv?
Ofta uppstår frågan hur man applicerar samma policy på flera arkiv.
Att manuellt lägga till policyer är en repetitiv och tidskrävande uppgift.
Här är ett kodexempel som kan användas för att applicera en policy på hundratals arkiv:
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
Det är enkelt att skapa en livscykelpolicy för ECR och automatiskt ta bort gamla bilder. AWS har omfattande dokumentation och exempel på hur man skapar livscykelpolicyer.
Du kan experimentera med olika policyer för taggade bilder, till exempel baserat på uppladdningsdatum.
Du kan även utforska andra AWS-terminologier för att bredda din förståelse för AWS.