Πώς να διαγράψετε εικόνες AWS ECR χωρίς ετικέτα και παλαιότερες εικόνες;

Το Amazon ECR είναι ενσωματωμένο με την υπηρεσία Amazon Elastic Kubernetes Service (Amazon EKS), την Amazon Elastic Container Service (Amazon ECS) και το AWS Lambda, απλοποιώντας τη ροή εργασιών ανάπτυξής σας στην παραγωγή.

Το Amazon ECR φιλοξενεί τις εικόνες σε μια εξαιρετικά επεκτάσιμη και διαθέσιμη αρχιτεκτονική, επιτρέποντάς σας να αναπτύξετε κοντέινερ με αξιοπιστία για τις εφαρμογές σας. Είναι σημαντικό να διαγράψετε εικόνες χωρίς ετικέτα και παλιές για να διατηρήσετε την υγιεινή.

Σήμερα, οι εφαρμογές λειτουργούν ως micro-service. Ο όρος micro-service δεν είναι παρά ένα κοντέινερ που συσκευάζει όλο τον κώδικα και τις εξαρτήσεις του, ώστε η εφαρμογή να μπορεί να εκτελείται γρήγορα και αξιόπιστα σε οποιοδήποτε υπολογιστικό περιβάλλον. Λόγω της φορητότητάς τους, του μικρού μεγέθους και της ευκολίας τους, τα εμπορευματοκιβώτια γίνονται μια μέθοδος επιλογής για την αποστολή σύγχρονων εφαρμογών.

Τα κοντέινερ έχουν σχεδιαστεί από ένα πρότυπο μόνο για ανάγνωση που ονομάζεται εικόνα. Αυτές οι εικόνες πρέπει να αποθηκευτούν κάπου, ώστε να μπορούν να ανακτηθούν από οποιοδήποτε μηχάνημα εξουσιοδοτημένο να τις χρησιμοποιεί.

Εκεί μπαίνει ένα μητρώο κοντέινερ. Πριν από λίγο καιρό, οι άνθρωποι χρησιμοποιούσαν το DockerHub για να αποθηκεύσουν αυτές τις εικόνες και αντικείμενα. Αλλά, εάν χρησιμοποιείτε υπηρεσίες cloud AWS, είμαι βέβαιος ότι χρησιμοποιείτε ήδη το AWS ECR, το οποίο είναι μια εναλλακτική λύση στο DockerHub.

Το AWS ECR είναι ένα πλήρως διαχειριζόμενο μητρώο κοντέινερ που παρέχει φιλοξενία υψηλής απόδοσης, επιτρέποντάς σας να αναπτύξετε εικόνες και τεχνουργήματα εφαρμογών με τη μορφή δημόσιων και ιδιωτικών αποθετηρίων.

Κάθε μέρα, πολλαπλές εφαρμογές που φιλοξενούνται από το AWS ωθούν και τραβούν εκατομμύρια εικόνες/τεχνουργήματα εφαρμογών μέσα/έξω από συγκεκριμένα αποθετήρια ECR.

Σε αυτό το άρθρο, θα συζητήσουμε πώς να διαγράψετε παλιά και απαρχαιωμένα AWS ECR και να διατηρήσετε καθαρά τα αποθετήρια ECR.

Η ανάγκη: Διαγράψτε τώρα χωρίς ετικέτα και παλιές εικόνες!

Ο πρωταρχικός λόγος για τον καθαρισμό των αποθετηρίων ECR είναι η υγιεινή ανάπτυξης. Ανά πάσα στιγμή, κανείς δεν θα ήθελε να κρατήσει εικόνες παλαιότερες από δέκα αναπτύξεις στα ECR του. Αυτό οφείλεται επίσης στο ότι οι επαναλήψεις συμβαίνουν συχνά στον κλάδο, αλλά μια επαναφορά που επαναφέρει την αλλαγή από 5 τεχνουργήματα παλαιότερα είναι σπάνια.

Με απλούστερους όρους, οποιαδήποτε εικόνα/τεχνουργήματα παλαιότερες από πέντε αναπτύξεις είναι άχρηστες. Μπορεί να αλλάξει στην αναφορά στρατηγικής του οργανισμού σας, αλλά δεν θα το συνιστούσαμε ως βέλτιστη πρακτική.

  Διορθώστε το πρόβλημα με το αργό πρόβλημα του Amazon Fire Stick

Σε ολόκληρο τον κλάδο, η προσθήκη ετικετών χρησιμοποιείται για τον καθορισμό των πιο σταθερών πιο πρόσφατων ή των τελευταίων πέντε πιο πρόσφατων εικόνων. Ως μέρος του κύκλου ζωής ανάπτυξης λογισμικού, οι εικόνες δημιουργούνται γρήγορα και αυτές οι ετικέτες αντικαθίστανται με νέες εικόνες, αφήνοντας τις παλαιότερες εικόνες χωρίς ετικέτα και άχρηστες.

Σε περιπτώσεις όπως αυτή, όπου οι εικόνες/τεχνουργήματα είναι μεγάλα, θα προσθέσει επίσης χρεώσεις αποθήκευσης στο ECR. Η τιμολόγηση του AWS ECR είναι “0,10 $ ανά GB / μήνα για δεδομένα που είναι αποθηκευμένα σε ιδιωτικά ή δημόσια αποθετήρια”.

Αυτή η τιμή μπορεί να σας φαίνεται μικρή, αλλά όπως λένε, οι σταγόνες αποτελούν τον ωκεανό. Όλες αυτές οι εικόνες, εάν αποθηκευτούν για μεγαλύτερο χρονικό διάστημα, θα προσθέσουν υψηλότερους λογαριασμούς στα τιμολόγιά σας AWS.

Η πρόταση είναι να διαγράψετε αυτές τις παλιές και χωρίς ετικέτα εικόνες από τα αποθετήρια ECR σας γιατί δεν τις χρειάζεστε! Απλός! Γιατί να το κρατήσετε και να το πληρώσετε;

Μη αυτόματη διαγραφή εικόνων AWS ECR

Μέθοδος 1: Ο τρόπος GUI!

Βήμα 1: Συνδεθείτε στον λογαριασμό Amazon Web Services και κατευθυνθείτε στο αποθετήριο που θέλετε να διαγράψετε.

Βήμα 2: Εδώ, μπορείτε να δείτε ότι το αποθετήριο έχει την πιο πρόσφατη ετικέτα για να καθορίσετε την πιο σταθερή έκδοση. Οι άλλες ετικέτες που βλέπετε μπορούν να ονομαστούν χωρίς ετικέτα. Για να διαγράψουμε, αρκεί να επιλέξουμε την εικόνα και να κάνουμε κλικ στο delete.

Βήμα 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 που βρίσκεται στην πολιτική δοκιμής ecr του αποθετηρίου.

Μέθοδος 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)

Η απάντηση θα σας έδινε τη λίστα των διαγραμμένων αναγνωριστικών εικόνων, μαζί με μια αποτυχία, εάν υπήρχε.

  Εξαγωγή φωτογραφιών HD από ένα βίντεο στο iPhone σας

Μέθοδος προγραμματισμού για τη διαγραφή εικόνων ECR

Εάν είστε μηχανικός DevOps ή διαχειρίζεστε τακτικά το AWS ECR, θα γνωρίζετε ήδη τον πόνο της μη αυτόματης διαγραφής αυτών των εικόνων.

Η εκτέλεση του σεναρίου/εντολής κάνει τα πράγματα πιο εύκολα, αλλά είμαστε σίγουροι ότι θα επιθυμούσατε κάτι που θα διαγράφει αυτόματα αυτές τις εικόνες από μόνες τους χωρίς να χρειάζεται να ανησυχείτε για αυτές.

Καλά νέα, το AWS ECR προσφέρει μια Πολιτική κύκλου ζωής για τις εικόνες σας, την οποία μπορείτε να ορίσετε ώστε να διαγράφονται αυτές οι εικόνες έγκαιρα ή προγραμματισμένο. Ας δούμε πώς να το κάνουμε.

Μέθοδος 1: Ο τρόπος GUI!

Βήμα 1: Μεταβείτε στο χώρο αποθήκευσης όπου θέλετε να ορίσετε την πολιτική κύκλου ζωής. Στο αριστερό πλαίσιο, μπορείτε να δείτε την Πολιτική κύκλου ζωής. Μπορείτε να κάνετε κλικ σε αυτό για να ξεκινήσετε.

Βήμα 2: Μπορείτε να κάνετε κλικ σε αυτό και να δημιουργήσετε τον πρώτο σας κανόνα.

Βήμα 3: Το ECR σάς επιτρέπει να διαγράψετε εικόνες υπό δύο συνθήκες, η μία είναι εάν οι εικόνες σας παίρνουν καθορισμένες ημέρες ή εάν έχουν επισημανθεί/χωρίς ετικέτα και θέλετε να τις διατηρήσετε μόνο για, ας πούμε, Χ αριθμό ημερών.

Ας δούμε πώς γίνεται. Τώρα μπορείτε να ορίσετε εάν θέλετε να διαγράψετε τις εικόνες χωρίς ετικέτα εάν είναι μία ημέρα ή μεγαλύτερες ή εάν ο αριθμός εικόνων των εικόνων χωρίς ετικέτα υπερβαίνει τη μία.

Επιλέξτε ανάλογα με την περίπτωση χρήσης σας. Μην ξεχνάτε? μπορείτε να αυξήσετε αυτούς τους αριθμούς στον αριθμό της επιλογής σας. Αποθήκευση για να ενεργοποιηθεί ο κανόνας κύκλου ζωής.

Μέθοδος 2: Ο τρόπος CLI!

Η εντολή AWS ECR CLI για τον ορισμό της πολιτικής κύκλου ζωής είναι put-lifecycle-policy.

Ας δούμε πώς να το κάνουμε. Για αυτό, πρέπει να δημιουργήσετε ένα αρχείο JSON που να αναφέρει τις συνθήκες πολιτικής. Μπορείτε να το ονομάσετε Policy.json ή οποιοδήποτε όνομα της επιλογής σας.

Αλλά πριν από αυτό, ας δούμε τα στοιχεία της πολιτικής του κύκλου ζωής.

rulePriority (Type: integer, Required: yes):

Σειρά κανόνα από χαμηλότερο προς υψηλότερο. Οι κανόνες πολιτικής κύκλου ζωής με προτεραιότητα ένα εφαρμόζονται πρώτα, μετά 2, κ.λπ. Οι κανόνες πολιτικής κύκλου ζωής πρέπει να έχουν μια μοναδική τιμή κανόνα.

Οι κανόνες πολιτικής δεν χρειάζονται διαδοχικές τιμές. Τυχόν κανόνες με ετικέτα πρέπει να έχουν τον υψηλότερο κανόναΠροτεραιότητα και να ελέγχονται τελευταίοι.

description (Type: string, Required: no):

Εξηγεί σε τι χρησιμεύει ένας κανόνας σε μια πολιτική κύκλου ζωής.

tagStatus (Type: string, Required: yes):

Ελέγχει εάν ο κανόνας πολιτικής του προστιθέμενου κύκλου ζωής καθορίζει μια ετικέτα εικόνας. Η προσθήκη ετικετών, χωρίς ετικέτα ή οποιαδήποτε είναι εντάξει. Εάν δεν έχει καθοριστεί καμία, αξιολογούνται όλες οι εικόνες. Η προσθήκη ετικέτας απαιτεί μια τιμή tagPrefixList. Το Untagged απαιτεί παράλειψη tagPrefixList.

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

Εάν το “tagStatus” έχει “επισημανθεί”, η πολιτική κύκλου ζωής σας απαιτεί μια λίστα προθεμάτων ετικετών εικόνας διαχωρισμένη με κόμματα.

  Τρόπος εξαγωγής και εισαγωγής ασφαλών και αποκλεισμένων αποστολέων του Outlook

Χρησιμοποιώντας το πρόθεμα ετικέτας 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):

Επιλέξτε έναν τύπο δράσης. Η τιμή που μπορεί να χρησιμοποιηθεί είναι “λήξη”.

Εδώ είναι το “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;

Συχνά, υπάρχουν ερωτήσεις σχετικά με τον τρόπο εφαρμογής της ίδιας πολιτικής σε πολλαπλά αποθετήρια.

Είναι μια επαναλαμβανόμενη και βαρετή εργασία να ορίζετε τις πολιτικές με μη αυτόματο τρόπο.

Ακολουθεί ένα απόσπασμα κώδικα που μπορεί να χρησιμοποιηθεί στο σύστημα παραγωγής για την εφαρμογή μιας πολιτικής σε αποθετήρια 100s+.

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.