AWS ECR Etiketsiz ve Eski Görüntüler Nasıl Silinir?

Yayınlanan: 2022-09-07

Amazon ECR, Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) ve AWS Lambda ile entegre olarak geliştirmeden üretime iş akışınızı basitleştirir.

Amazon ECR, görüntüleri yüksek düzeyde ölçeklenebilir ve kullanılabilir bir mimaride barındırarak uygulamalarınız için kapsayıcıları güvenilir bir şekilde dağıtmanıza olanak tanır. Hijyeni korumak için etiketlenmemiş ve eski görüntüleri silmek önemlidir.

Günümüzde uygulamalar mikro hizmet olarak çalışmaktadır. Mikro hizmet terimi, uygulamanın herhangi bir bilgi işlem ortamında hızlı ve güvenilir bir şekilde çalışabilmesi için tüm kodu ve bağımlılıklarını paketleyen bir kapsayıcıdan başka bir şey değildir. Taşınabilirlikleri, küçük boyutları ve kolaylıkları nedeniyle konteynerler, modern uygulamaların nakliyesi için tercih edilen bir yöntem haline geliyor.

Kapsayıcılar, görüntü adı verilen salt okunur bir şablondan tasarlanmıştır. Bu görüntülerin, onları kullanmaya yetkili herhangi bir makine tarafından alınabilmeleri için bir yerde saklanması gerekir.

İşte burada bir kapsayıcı kayıt defteri devreye giriyor. Kısa bir süre önce insanlar bu görüntüleri ve yapıları depolamak için DockerHub'ı kullandılar. Ancak AWS bulut servislerini kullanıyorsanız eminim DockerHub'a alternatif olan AWS ECR'yi zaten kullanıyorsunuzdur.

AWS ECR, uygulama görüntülerini ve yapılarını genel ve özel depolar biçiminde dağıtmanıza olanak tanıyan, yüksek performanslı barındırma sağlayan, tam olarak yönetilen bir kapsayıcı kayıt defteridir.

Her gün, AWS tarafından barındırılan birden çok uygulama, milyonlarca görüntüyü/uygulama yapısını belirli ECR havuzlarına/bu depolardan içeri/dışarı iter ve çeker.

Bu yazıda, eski ve kullanılmayan AWS ECR'nin nasıl temizleneceğini ve ECR depolarının nasıl temiz tutulacağını tartışacağız.

İhtiyaç: Etiketsiz ve Eski Resimleri Hemen Silin!

ECR depolarını temizlemenin birincil nedeni geliştirme hijyenidir. Herhangi bir zamanda, hiç kimse ECR'lerinde on dağıtımdan daha eski görüntüleri tutmak istemez. Bunun nedeni, endüstride geri almaların sıklıkla meydana gelmesidir, ancak daha önce 5 yapıdaki değişikliği geri alan bir geri alma nadirdir.

Daha basit bir ifadeyle, beş dağıtımdan eski herhangi bir görüntü/yapıt işe yaramaz. Kuruluşunuzun strateji raporunda değişikliğe tabidir, ancak bunu en iyi uygulama olarak önermeyiz.

Sektör genelinde etiketleme, en kararlı en son veya en son beş görüntüyü belirtmek için kullanılır. Yazılım geliştirme yaşam döngüsünün bir parçası olarak, görüntüler hızla oluşturulur ve bu etiketler yeni görüntülerle değiştirilir ve eski görüntüler etiketsiz ve işe yaramaz hale gelir.

Görüntülerin/yapıların büyük olduğu bu gibi durumlarda, ECR'de depolama ücretleri de ekleyecektir. AWS ECR'nin fiyatlandırması "özel veya genel depolarda depolanan veriler için GB başına aylık 0,10 ABD dolarıdır".

Bu fiyat size küçük gelebilir ama dedikleri gibi, okyanusu damlalar oluşturur. Tüm bu görüntüler, daha uzun süre depoda tutulursa, AWS faturalarınıza daha yüksek faturalar ekleyecektir.

Öneri, ihtiyacınız olmadığı için bu eski ve etiketlenmemiş görüntüleri ECR depolarınızdan temizlemenizdir! Basit! Neden saklasın ve bedelini ödesin?

AWS ECR Görüntülerini Manuel Olarak Silme

Yöntem 1: GUI Yolu!

Adım 1: Amazon Web Services hesabına giriş yapın ve temizlemek istediğiniz depoya gidin.

Adım 2: Burada, deponun en kararlı sürümü belirtmek için en son etikete sahip olduğunu görebilirsiniz. Gördüğünüz diğer etiketler etiketsiz olarak adlandırılabilir. Silmek için resmi seçip sil'e tıklamamız yeterli.

Adım 3 : Silmeyi Onaylayın

Yöntem 2: CLI Yolu!

CLI'yi kullanarak bir görüntüyü silmek için, makinenizde yapılandırılmış tüm AWS IAM erişim anahtarlarına ve depolara erişim sağlamak için gerekli IAM iznine ihtiyacınız olacaktır.

Bu durumda, zaten yapılandırdık. Henüz yapmadıysanız, AWS yapılandırma temelleri kılavuzundan yapabilirsiniz.

Makinenizde AWS CLI'yi yapılandırdığınızdan emin değilseniz, doğrulamak için aşağıdaki komutu kullanın.

 aws sts get-caller-identity

Artık AWS CLI'yi kullanabileceğimizi onayladığımıza göre, etiketlenmemiş bir ECR görüntüsünü silmek için aşağıdaki komutu kullanabilirsiniz.

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

Burada GUI'de yaptığımıza benzer bir şey yapıyoruz. Test-ecr-policy deposunda bulunan custom-image-6 olarak etiketlenen görseli sileceğiz.

Yöntem 3: Komut Dosyası Yolu!

Bu yöntemin ön koşulu, üzerinde çalıştığınız makinede yapılandırılmış bir AWS Erişim anahtarına sahip olmaktır.

Etiketlenmemiş görüntüleri silmek için komut dosyası.

 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)

Yanıt, varsa bir başarısızlıkla birlikte silinen resim kimliklerinin listesini verir.

ECR Görüntülerini Silmek İçin Zamanlama Yöntemi

Bir DevOps mühendisiyseniz veya düzenli olarak AWS ECR'yi yönetiyorsanız, bu görüntüleri manuel olarak silmenin zorluklarını zaten bileceksiniz.

Komut dosyasını/komutu çalıştırmak işleri kolaylaştırır, ancak bu görüntüleri endişelenmenize gerek kalmadan kendi başlarına otomatik olarak silecek bir şey isteyeceğinizden eminiz.

İyi Haber, AWS ECR, görüntüleriniz için, bu görüntüleri zamanında veya planlı bir şekilde silmek üzere ayarlayabileceğiniz bir Yaşam Döngüsü Politikası sunar. Nasıl yapacağımıza bir bakalım.

Yöntem 1: GUI Yolu!

Adım 1: Yaşam Döngüsü ilkesini ayarlamak istediğiniz depoya gidin. Sol panelde Yaşam Döngüsü Politikasını görebilirsiniz. Başlamak için üzerine tıklayabilirsiniz.

Adım 2: Üzerine tıklayıp ilk kuralınızı oluşturabilirsiniz.

3. Adım: ECR, görüntüleri iki koşulda silmenize olanak tanır; bunlardan biri, görüntüleriniz belirtilen günlerde eskiyse veya etiketlenmiş/etiketlenmemişse ve bunları yalnızca X gün kadar saklamak istiyorsanız.

Nasıl yapıldığını görelim. Artık, etiketlenmemiş görüntülerin bir gün veya daha eski olması veya etiketlenmemiş görüntülerin görüntü sayısının bir'i aşması durumunda silmek isteyip istemediğinizi ayarlayabilirsiniz.

Kullanım durumunuza göre seçin. unutma; bu sayıları istediğiniz sayıya kadar artırabilirsiniz. Yaşam Döngüsü Kuralını tetiklemek için kaydedin.

Yöntem 2: CLI Yolu!

Yaşam döngüsü ilkesini ayarlamak için AWS ECR CLI komutu put-lifecycle-policy'dir.

Nasıl yapacağımıza bir bakalım. Bunun için politika koşullarını listeleyen bir JSON dosyası oluşturmalısınız. Politika.json veya istediğiniz herhangi bir ad verebilirsiniz.

Ancak bundan önce, yaşam döngüsü ilkesi öğelerine bakalım.

 rulePriority (Type: integer, Required: yes):

Düşükten yükseğe kural sırası. Öncelik 1, sonra 2 vb. olan yaşam döngüsü ilkesi kuralları uygulanır. Yaşam döngüsü ilkesi kurallarının her birinin benzersiz bir kural değeri olmalıdır.

İlke kurallarının ardışık değerlere ihtiyacı yoktur. Tüm etiketli kurallar, en yüksek kural Önceliğine sahip olmalı ve en son gözden geçirilmelidir.

 description (Type: string, Required: no):

Yaşam döngüsü ilkesindeki bir kuralın ne için olduğunu açıklar.

 tagStatus (Type: string, Required: yes):

Eklenen yaşam döngüsü ilkesi kuralının bir resim etiketi belirtip belirtmediğini kontrol eder. Etiketli, etiketsiz veya herhangi bir sorun yok. Hiçbiri belirtilmezse, tüm görüntüler değerlendirilir. Tagged, bir tagPrefixList değeri gerektirir. Etiketlenmemiş, tagPrefixList'in atlanmasını gerektirir.

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

"tagStatus" "etiketli" ise, yaşam döngüsü ilkeniz virgülle ayrılmış bir resim etiketi önekleri listesi gerektirir.

prod etiket önekini kullanarak, prod, prod1, prod2, vb. olarak işaretlenen tüm görüntüleri belirtebilirsiniz. Birden çok etiket yalnızca tüm etiketlere sahip görüntüleri seçer.

 countType (Type: string, Required: yes):

Deponuzdaki görüntü sayısını sınırlamak için countType imageCountMoreThan ise countNumber değerini belirtin.

Deponun resimlerini sınırlamak için countType beriImagePushed ise countUnit ve countNumber'ı belirtin.

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

Bir sayı birimini yalnızca countType beriImagePushed olduğunda belirtin; aksi takdirde bir hata oluşur.

 countNumber (Type: integer, Required: yes):

Yalnızca pozitif tam sayılar (0 kabul edilen bir değer değildir). countType imageCountMoreThan ise, değer, tutulacak maksimum fotoğraf sayısıdır. CountType olarak SinceImagePushed'ın kullanılması, maksimum görüntü yaşını belirler.

 type (Type: string, Required: yes):

Bir eylem türü seçin. Kullanılabilecek değer "expire"dir.

İşte benim "policy.json"um.

 { "rules": [ { "rulePriority": 1, "description": "Expire images older than 10 days", "selection": { "tagStatus": "untagged", "countType": "sinceImagePushed", "countUnit": "days", "countNumber": 14 }, "action": { "type": "expire" } } ] }

Kuruluşunuzun gereksinimlerine göre. “sinceImagePushed” , “imageCountMoreThan” ile değiştirilebilir .

Bu politikayı ayarlamak için CLI komutu şöyle olacaktır:

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

Yöntem 3: Komut Dosyası Yolu!

Bunu başarmak için boto3 komutunu kullanacağız. Bunu ayarlamak için aynı “policy.json”u kullanabiliriz. Kullanılan kod parçacığı aşağıdadır.

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

Birden Çok ECR Deposunda Tek Bir İlke Nasıl Uygulanır?

Çoğu zaman, aynı politikanın birden çok havuza nasıl uygulanacağına dair sorular vardır.

Politikaları manuel olarak ayarlamak tekrarlayan ve sıkıcı bir iştir.

100'lerden fazla veri havuzunda bir ilke uygulamak için üretim sisteminde kullanılabilecek bir kod parçacığını burada bulabilirsiniz.

 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)

Çözüm

Kolayca bir ECR yaşam döngüsü politikası oluşturabilir ve belirtilen parametrelere göre eski görüntüleri imha edebiliriz. AWS, kapsamlı belgelerin yanı sıra yaşam döngüsü ilkeleri örnekleri sağlar.

Ayrıca, etiketli resimler için, resmin yüklendiği tarihle eşleştirme ölçütleri gibi alternatif politikalarla denemeler yapabilirsiniz.

AWS Learning'inizi geliştiren bazı AWS Anahtar Terminolojilerini de keşfedebilirsiniz.