Forbedre arbeidsflyten med Amazon ECR
Amazon ECR er tett integrert med Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) og AWS Lambda, noe som bidrar til en smidigere utviklingsprosess frem til produksjon. Denne integrasjonen gjør det enklere å håndtere containeriserte applikasjoner i ulike AWS-miljøer.
Med Amazon ECR får du en svært skalerbar og tilgjengelig infrastruktur for å lagre containerbilder. Dette sikrer pålitelig distribusjon av containere for dine applikasjoner. Det er viktig å fjerne umerkede og gamle bilder for å opprettholde en ryddig og effektiv containerhåndtering.
Moderne applikasjoner blir ofte utviklet som mikrotjenester. En mikrotjeneste er i praksis en container som kapsler inn all nødvendig kode og avhengigheter, slik at applikasjonen kan kjøre raskt og pålitelig i forskjellige datamiljøer. Containernes portabilitet, kompakte størrelse og brukervennlighet gjør dem til et foretrukket valg for distribusjon av moderne applikasjoner.
Containere er bygget fra en skrivebeskyttet mal som kalles et bilde. Disse bildene må lagres på et sted hvor de kan hentes av maskiner som har autorisasjon til å bruke dem. Dette er rollen til et containerregister.
Tidligere brukte mange DockerHub for å lagre bilder og artefakter. Men hvis du benytter deg av AWS sine skytjenester, er det sannsynlig at du allerede bruker AWS ECR, som er et velfungerende alternativ til DockerHub.
AWS ECR er et fullt administrert containerregister som tilbyr høyytelseslagring. Dette gjør det mulig å distribuere applikasjonsbilder og artefakter i form av både offentlige og private arkiver.
Hver dag laster mange AWS-applikasjoner opp og ned millioner av bilder og applikasjonsartefakter til og fra spesifikke ECR-lagre.
I denne artikkelen vil vi utforske hvordan du kan rydde opp i gamle og utdaterte AWS ECR-bilder, og hvordan du kan opprettholde ryddighet i ECR-lagrene.
Viktigheten av å slette umerkede og gamle bilder
Hovedgrunnen til å rydde opp i ECR-lagre er god utviklingshygiene. Ingen ønsker å beholde bilder som er eldre enn ti distribusjoner i sine ECR-er. Det er fordi tilbakeføringer er vanlige, men en tilbakeføring som går lenger tilbake enn 5 artefakter er sjeldne.
Med andre ord er alle bilder og artefakter som er eldre enn fem distribusjoner som oftest ubrukelige. Dette kan endres i organisasjonens strategi, men vi anbefaler ikke dette som beste praksis.
I bransjen er det vanlig å bruke tagging for å identifisere de mest stabile, siste, eller de fem siste bildene. Som en del av utviklingsprosessen genereres bilder raskt, og disse taggene erstattes med nye bilder. Dette fører til at de eldre bildene blir umerket og ubrukelige.
Når bilder og artefakter er store, vil det også påvirke lagringskostnadene i ECR. AWS ECR koster «$0,10 per GB / måned for data lagret i private eller offentlige depoter».
Denne prisen kan virke liten, men som ordtaket sier, mange bekker små, gjør en stor å. Alle disse bildene, hvis de lagres over tid, vil øke regningen på AWS-fakturaen.
Derfor er det lurt å fjerne disse gamle og umerkede bildene fra ECR-lagrene dine. Enkelt og greit! Hvorfor betale for noe du ikke trenger?
Manuell sletting av AWS ECR-bilder
Metode 1: Grafisk grensesnitt (GUI)
Trinn 1: Logg deg på Amazon Web Services-kontoen og naviger til depotet du ønsker å rydde.
Trinn 2: I depotet vil du se den nyeste taggen som identifiserer den mest stabile versjonen. De andre taggene kan kalles umerkede. For å slette, velg bildet og klikk på slett.
Trinn 3: Bekreft slettingen.
Metode 2: Kommandolinje (CLI)
For å slette et bilde med CLI, må du ha AWS IAM-tilgangsnøkler konfigurert på maskinen din, samt nødvendige IAM-tillatelser for å få tilgang til depotene.
I dette tilfellet er dette allerede konfigurert. Du kan følge AWS sin veiledning for grunnleggende konfigurering hvis dette ikke er gjort.
Hvis du er usikker på om du har konfigurert AWS CLI på maskinen, kan du bruke følgende kommando for å bekrefte:
aws sts get-caller-identity
Når du har bekreftet at AWS CLI er i orden, 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 tilsvarende som i GUI. Vi vil slette bildet merket «custom-image-6» som ligger i depotet «test-ecr-policy».
Metode 3: Skripting
For denne metoden må du ha konfigurert en AWS Access-nøkkel på maskinen du kjører skriptet på.
Her er et 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 en liste over slettede bilde-ID-er, samt eventuelle feil.
Planlegging av sletting av ECR-bilder
Hvis du er en DevOps-ingeniør eller administrerer AWS ECR regelmessig, er du nok kjent med frustrasjonen ved å slette bilder manuelt.
Skript/kommandoer gjør ting lettere, men vi er sikre på at du ville foretrukket noe som sletter bilder automatisk, uten at du trenger å bekymre deg for det.
Gode nyheter! AWS ECR tilbyr en livssykluspolicy for bildene dine. Denne kan settes opp til å slette bilder på en planlagt måte. La oss se hvordan du gjør det.
Metode 1: Grafisk grensesnitt (GUI)
Trinn 1: Naviger til depotet der du vil konfigurere livssykluspolicyen. I venstre panel vil du se «Livssykluspolicy». Klikk på den for å starte.
Trinn 2: Klikk for å opprette din første regel.
Trinn 3: ECR gir deg muligheten til å slette bilder basert på to kriterier: Enten hvis bildene er X antall dager gamle, eller hvis de er merkede/umerkede og du ønsker å beholde de i en viss periode.
La oss se hvordan dette gjøres. Du kan velge å slette umerkede bilder hvis de er en dag eller eldre, eller hvis antallet umerkede bilder overstiger et visst antall.
Velg etter ditt behov. Du kan øke disse tallene til det du ønsker. Lagre for å aktivere livssyklusregelen.
Metode 2: Kommandolinje (CLI)
AWS ECR CLI-kommandoen for å angi livssykluspolicy er «put-lifecycle-policy».
La oss se hvordan du gjør det. Først må du opprette en JSON-fil som definerer policybetingelsene. Du kan kalle filen «policy.json» eller hva du ønsker.
Før det, la oss se på elementene i en livssykluspolicy:
rulePriority (Type: integer, Required: yes):
Reglenes rekkefølge fra lav til høy. Livssykluspolicyregler med prioritet 1 brukes først, deretter 2 osv. Hver livssykluspolicyregel må ha en unik regelverdi.
Policyregler trenger ikke fortløpende verdier. Merkede regler bør ha høyest regelprioritet og gjennomgås sist.
description (Type: string, Required: no):
Forklarer formålet med en regel i livssykluspolicyen.
tagStatus (Type: string, Required: yes):
Sjekker om livssyklusregelen spesifiserer en bildetag. «Merket», «umerket» eller «alle» er ok. Hvis ingenting er spesifisert, vurderes alle bilder. «Merket» krever en «tagPrefixList»-verdi. «Umerket» krever at «tagPrefixList» utelates.
tagPrefixList (Type: list[string], Required: yes, only if tagStatus is set to tagged):
Hvis «tagStatus» er «merket», krever livssykluspolicyen din en liste med kommaseparerte tagprefiks for bilder.
Ved å bruke tagprefiks «prod», kan du spesifisere alle bilder som er 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.
Spesifiser «countUnit» og «countNumber» hvis «countType» er «sinceImagePushed» for å begrense bilder i depotet.
countUnit (Type: string, Required: yes, only if countType is set to sinceImagePushed):
Spesifiser kun en telleenhet når «countType» er «sinceImagePushed». Ellers oppstår 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 bilder som skal beholdes. Ved å bruke «sinceImagePushed» som «countType» bestemmes maksimal bildealder.
type (Type: string, Required: yes):
Velg handlingstype. Eneste verdi som kan brukes er «expire».
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" } } ] }
Dette kan tilpasses organisasjonens behov. «sinceImagePushed» kan erstattes med «imageCountMoreThan».
CLI-kommandoen for å bruke denne policyen vil være:
aws ecr put-lifecycle-policy --repository-name "test-ecr-polict" --lifecycle-policy-text "file://policy.json"
Metode 3: Skripting
Vi vil bruke boto3 for å oppnå dette. Vi kan bruke den samme «policy.json» for å sette opp dette. Nedenfor er en kodebit som viser dette:
import boto3 client = boto3.client('ecr') response = client.put_lifecycle_policy( registryId='PODES12342', repositoryName="test-ecr-policy", lifecyclePolicyText="plicy.json" ) print(response)
Hvordan bruke en enkelt policy på flere ECR-depoter?
Det er ofte spørsmål om hvordan du bruker den samme policyen på tvers av flere depoter.
Det er tidkrevende og kjedelig å konfigurere policyer manuelt.
Her er en kodebit som kan brukes i et produksjonssystem for å bruke en policy på hundrevis av depoter:
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 lage en ECR-livssykluspolicy og slette gamle bilder basert på angitte parametere. AWS tilbyr omfattende dokumentasjon og eksempler på livssykluspolicyer.
Du kan også eksperimentere med alternative policyer for merkede bilder, for eksempel samsvarende kriterier med datoen bildet ble lastet opp.
Du kan også utforske andre AWS-nøkkelterminologier for å forbedre din forståelse av AWS.