Hvordan slette AWS ECR umerkede og eldre bilder?

Amazon ECR er integrert med Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) og AWS Lambda, noe som forenkler utviklingen til produksjonsarbeidsflyten.

Amazon ECR er vert for bildene i en svært skalerbar og tilgjengelig arkitektur, slik at du kan distribuere beholdere pålitelig for applikasjonene dine. Det er viktig å slette umerkede og gamle bilder for å opprettholde hygienen.

I dag kjøres applikasjoner som mikrotjenester. Begrepet mikrotjeneste er ikke annet enn en beholder som pakker all koden og dens avhengigheter, slik at applikasjonen kan kjøre raskt og pålitelig i ethvert datamiljø. På grunn av deres portabilitet, lille størrelse og bekvemmelighet, er containere i ferd med å bli en valgmetode for frakt av moderne applikasjoner.

Beholdere er designet fra en skrivebeskyttet mal kalt et bilde. Disse bildene må lagres et sted slik at de kan hentes av en hvilken som helst maskin som er autorisert til å bruke dem.

Det er her et containerregister kommer inn. For ikke lenge siden brukte folk DockerHub til å lagre disse bildene og artefaktene. Men hvis du bruker AWS skytjenester, er jeg sikker på at du allerede bruker AWS ECR, som er et alternativ til DockerHub.

AWS ECR er et fullt administrert containerregister som gir høyytelses hosting, slik at du kan distribuere applikasjonsbilder og artefakter i form av offentlige og private arkiver.

Hver dag skyver og trekker flere AWS-vertsbaserte applikasjoner millioner av bilder/applikasjonsartefakter inn i/ut av spesifikke ECR-lagre.

I denne artikkelen vil vi diskutere hvordan du tømmer gammel og utdatert AWS ECR og holder ECR-lagrene rene.

Behovet: Slett umerkede og gamle bilder nå!

Den primære grunnen til å rengjøre ECR-lagre er utviklingshygiene. Ingen vil til enhver tid ønske å beholde bilder som er eldre enn ti distribusjoner i sine ECR-er. Det er også fordi tilbakeføringer ofte skjer i bransjen, men en tilbakeføring som tilbakestiller endringen fra 5 artefakter tidligere er sjelden.

  Hvordan få den største DoorDash-bestillingen

I enklere termer er alle bilder/artefakter som er mer enn fem gamle distribusjoner ubrukelige. Det kan endres i organisasjonens strategirapport, men vi vil ikke anbefale det som en beste praksis.

Over hele bransjen brukes tagging for å spesifisere de mest stabile siste eller siste fem siste bildene. Som en del av livssyklusen for programvareutvikling genereres bildene raskt, og disse kodene erstattes med nye bilder, slik at de eldre bildene ikke er merket og ubrukelige.

I situasjoner som dette, hvor bilder/artefakter er store, vil den også legge til lagringskostnader på ECR. Prisen på AWS ECR er «$0,10 per GB / måned for data lagret i private eller offentlige depoter».

Denne prisen kan se liten ut for deg, men som de sier, dråper utgjør havet. Alle disse bildene, hvis de lagres over en lengre periode, vil legge til høyere regninger på AWS-fakturaene dine.

Forslaget er å fjerne disse gamle og umerkede bildene fra ECR-lagrene dine fordi du ikke trenger dem! Enkel! Hvorfor beholde den og betale for den?

Slette AWS ECR-bilder manuelt

Metode 1: The GUI Way!

Trinn 1: Logg på Amazon Web Services-kontoen og gå til depotet du vil tømme.

Trinn 2: Her kan du se at depotet har den nyeste taggen for å spesifisere den mest stabile versjonen. De andre taggene du ser kan kalles utagget. For å slette trenger vi bare å velge bildet og klikke på slett.

Trinn 3: Bekreft for å slette

Metode 2: The CLI Way!

For å slette et bilde ved hjelp av CLI, trenger du alle AWS IAM-tilgangsnøkler konfigurert på maskinen din og den nødvendige IAM-tillatelsen for å gi deg tilgang til depotene.

I dette tilfellet har vi allerede konfigurert det. Du kan gjøre det fra AWS-veiledningen for grunnleggende konfigurasjon hvis du ikke allerede har gjort det.

Hvis du er usikker på om du har konfigurert AWS CLI på maskinen din, bruk følgende kommando for å bekrefte.

aws sts get-caller-identity

Nå som vi har bekreftet at vi kan bruke AWS CLI, kan du bruke følgende kommando for å slette et umerket ECR-bilde.

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

Her gjør vi noe som ligner på det vi gjorde i GUI. Vi vil slette bildet merket som custom-image-6 som ligger i repository test-ecr-policy.

Metode 3: The Scripting Way!

Forutsetningen for denne metoden er å ha en AWS Access-nøkkel konfigurert på maskinen du kjører på.

  Hvordan fjerne noen fra en Slack Channel [All Devices]

Skript for å slette umerkede 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 vil gi deg listen over slettede bilde-ID-er, sammen med en feil hvis det var noen.

Planleggingsmetode for å slette ECR-bilder

Hvis du er DevOps-ingeniør eller regelmessig administrerer AWS ECR, vil du allerede kjenne smerten ved å slette disse bildene manuelt.

Å kjøre skriptet/kommandoen gjør ting enklere, men vi er sikre på at du ville ha ønsket deg noe som automatisk ville slette disse bildene på egen hånd uten at du trenger å bekymre deg for dem.

Gode ​​nyheter, AWS ECR tilbyr en livssykluspolicy for bildene dine, som du kan stille inn til å slette disse bildene på en rettidig eller planlagt måte. La oss se hvordan du gjør det.

Metode 1: The GUI Way!

Trinn 1: Gå over til depotet der du vil angi livssykluspolicyen. På venstre panel kan du se livssykluspolicyen. Du kan klikke på den for å komme i gang.

Trinn 2: Du kan klikke på den og lage din første regel.

Trinn 3: ECR lar deg slette bilder på to betingelser, den ene er hvis bildene dine blir spesifiserte dager gamle eller hvis de er merket/umerket, og du ønsker å beholde dem bare i for eksempel X antall dager.

La oss se hvordan det gjøres. Nå kan du angi om du vil slette umerkede bilder hvis de er én dag eller eldre, eller hvis bildeantallet av umerkede bilder overstiger ett.

Velg i henhold til din brukssituasjon. Ikke glem; du kan øke disse tallene til tallet du ønsker. Lagre for å utløse livssyklusregelen.

Metode 2: The CLI Way!

AWS ECR CLI-kommandoen for å angi livssykluspolicy er put-lifecycle-policy.

La oss se hvordan du gjør det. For dette må du opprette en JSON-fil som viser policybetingelsene. Du kan navngi den policy.json eller et hvilket som helst navn du ønsker.

Men før det, la oss se på livssykluspolitiske elementer.

rulePriority (Type: integer, Required: yes):

Lavere til høyere regelrekkefølge. Livssykluspolicyregler med prioritet én brukes først, deretter 2 osv. Livssykluspolicyregler må hver ha en unik regelverdi.

Politiske regler trenger ikke fortløpende verdier. Eventuelle merkede regler må ha høyeste regelprioritet og gjennomgås sist.

description (Type: string, Required: no):

Forklarer hva en regel i en livssykluspolicy er til for.

tagStatus (Type: string, Required: yes):

Den sjekker om den ekstra livssyklusregelen spesifiserer en bildekode. Merket, umerket eller noe er OK. Hvis ingen er spesifisert, blir alle bilder vurdert. Tagged krever en tagPrefixList-verdi. Utagget krever utelatelse av tagPrefixList.

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

Hvis «tagStatus» er «tagget», krever livssykluspolicyen din en kommadelt liste over bildetagprefikser.

  Slik bruker du Slack-påminnelser (opprett, rediger, slett og se påminnelser)

Ved å bruke tagprefikset prod kan du spesifisere alle bilder merket prod, prod1, prod2 osv. Flere tagger velger kun bilder med alle tagger.

countType (Type: string, Required: yes):

Spesifiser countNumber hvis countType er imageCountMoreThan for å begrense antall bilder i depotet ditt.

Spesifiser countUnit og countNumber hvis countType er sinceImagePushed for å begrense depotets bilder.

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

Spesifiser bare en telleenhet når countType er sinceImagePushed; ellers oppstår det en feil.

countNumber (Type: integer, Required: yes):

Bare positive heltall (0 er ikke en akseptert verdi). Hvis countType er imageCountMoreThan, er verdien det maksimale antallet fotografier å beholde. Bruk av sinceImagePushed som countType bestemmer maksimal bildealder.

 type (Type: string, Required: yes):

Velg en type handling. Verdien som kan brukes er «utløper».

Her er 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"

}

}

]

}

I henhold til organisasjonens krav. «sidenImagePushed» kan erstattes med «imageCountMoreThan».

CLI-kommandoen for å angi denne policyen vil være:

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

Metode 3: The Scripting Way!

Vi vil bruke kommandoen boto3 for å oppnå dette. Vi kan bruke den samme «policy.json» for å sette opp dette. Nedenfor er den brukte kodebiten.

import boto3

client = boto3.client('ecr')

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

print(response)

Hvordan bruker en enkelt policy på flere ECR-depoter?

Ofte er det spørsmål om hvordan du bruker den samme policyen på tvers av flere depoter.

Det er en repeterende og kjedelig oppgave å sette retningslinjer manuelt.

Her er en kodebit som kan brukes i produksjonssystemet for å bruke en policy på tvers av 100s+ repositories.

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)

Konklusjon

Vi kan enkelt konstruere en ECR-livssykluspolicy og ødelegge eldre bilder i henhold til spesifiserte parametere. AWS gir omfattende dokumentasjon samt eksempler på livssykluspolicyer.

Du kan også eksperimentere med alternative retningslinjer for merkede bilder, for eksempel samsvarende kriterier med datoen bildet ble lastet opp.

Du kan også utforske noen AWS-nøkkelterminologier som fremmer AWS-læringen din.