كيفية حذف الصور الأقدم وغير المميزة بعلامات AWS ECR؟

تم دمج Amazon ECR مع Amazon Elastic Kubernetes Service (Amazon EKS) و Amazon Elastic Container Service (Amazon ECS) و AWS Lambda ، مما يبسط تطورك إلى سير عمل الإنتاج.

تستضيف Amazon ECR الصور بهيكلية متاحة وقابلة للتطوير بدرجة كبيرة ، مما يسمح لك بنشر الحاويات بشكل موثوق لتطبيقاتك. من المهم حذف الصور القديمة وغير المميزة بعلامات للحفاظ على النظافة.

اليوم ، تعمل التطبيقات كخدمة صغيرة. مصطلح الخدمة المصغرة ليس سوى حاوية تحزم كل التعليمات البرمجية وتبعياتها بحيث يمكن تشغيل التطبيق بسرعة وموثوقية في أي بيئة حوسبة. نظرًا لقابليتها للنقل وصغر حجمها وملاءمتها ، أصبحت الحاويات وسيلة مفضلة لشحن التطبيقات الحديثة.

تم تصميم الحاويات من نموذج للقراءة فقط يسمى صورة. يجب تخزين هذه الصور في مكان ما بحيث يمكن استرجاعها بواسطة أي جهاز مصرح له باستخدامها.

هذا هو المكان الذي يأتي فيه سجل الحاوية. منذ وقت ليس ببعيد ، استخدم الناس DockerHub لتخزين هذه الصور والتحف. ولكن ، إذا كنت تستخدم خدمات AWS السحابية ، فأنا متأكد من أنك تستخدم بالفعل AWS ECR ، وهو بديل لـ DockerHub.

AWS ECR عبارة عن سجل حاويات مُدار بالكامل يوفر استضافة عالية الأداء ، مما يسمح لك بنشر صور التطبيق والتحف في شكل مستودعات عامة وخاصة.

كل يوم ، تدفع العديد من التطبيقات المستضافة على AWS وتسحب ملايين الصور / أدوات التطبيق إلى / خارج مستودعات ECR المحددة.

في هذه المقالة ، سنناقش كيفية مسح AWS ECR القديمة والمتقادمة والحفاظ على نظافة مستودعات ECR.

الحاجة: حذف الصور القديمة وغير المميزة الآن!

السبب الرئيسي لتنظيف مستودعات ECR هو تطوير النظافة. في أي وقت ، لن يرغب أي شخص في الاحتفاظ بالصور الأقدم من عشر عمليات نشر في ECRs الخاصة به. يرجع ذلك أيضًا إلى حدوث عمليات التراجع كثيرًا في الصناعة ، ولكن من النادر حدوث تراجع عن التغيير من 5 قطع أثرية في وقت سابق.

بعبارات أبسط ، فإن أي صورة / قطع أثرية أقدم من خمس عمليات نشر تكون عديمة الفائدة. إنه عرضة للتغيير في تقرير إستراتيجية مؤسستك ، لكننا لا نوصي به كأفضل ممارسة.

في جميع أنحاء الصناعة ، يتم استخدام العلامات لتحديد أحدث خمس صور أو أحدث خمس صور. كجزء من دورة حياة تطوير البرامج ، يتم إنشاء الصور بسرعة ، ويتم استبدال هذه العلامات بصور جديدة ، تاركًا الصور القديمة بدون علامات وغير مجدية.

  كيفية إضافة زر Shazam إلى مركز تحكم iPhone الخاص بك

في مثل هذه الحالات ، حيث تكون الصور / القطع الأثرية كبيرة ، ستضيف أيضًا رسوم تخزين على ECR. تسعير AWS ECR هو “0.10 دولار لكل جيجابايت / شهر للبيانات المخزنة في مستودعات خاصة أو عامة”.

قد يبدو هذا السعر صغيرًا بالنسبة لك ، ولكن كما يقولون ، تشكل القطرات المحيط. كل هذه الصور ، إذا تم تخزينها لفترة أطول ، ستضيف فواتير أعلى إلى فواتير AWS الخاصة بك.

الاقتراح هو مسح هذه الصور القديمة وغير المميزة من مستودعات ECR لأنك لست بحاجة إليها! بسيط! لماذا تحتفظ بها وتدفع ثمنها؟

حذف صور AWS ECR يدويًا

الطريقة الأولى: طريقة واجهة المستخدم الرسومية!

الخطوة 1: قم بتسجيل الدخول إلى حساب Amazon Web Services وتوجه إلى المستودع الذي تريد مسحه.

الخطوة 2: هنا ، يمكنك أن ترى أن المستودع يحتوي على أحدث علامة لتحديد الإصدار الأكثر استقرارًا. يمكن تسمية العلامات الأخرى التي تراها بدون علامات. للحذف ، نحتاج فقط إلى تحديد الصورة والنقر فوق حذف.

الخطوة 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

نحن هنا نفعل شيئًا مشابهًا لما فعلناه في واجهة المستخدم الرسومية. سنحذف الصورة التي تم وضع علامة عليها كـ Custom-image-6 المقيمة في سياسة المستودع test-ecr-policy.

الطريقة الثالثة: طريقة البرمجة!

الشرط الأساسي لهذه الطريقة هو تكوين مفتاح AWS Access في الجهاز الذي تستخدمه.

البرنامج النصي لحذف الصور غير المميزة.

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)

يمنحك الرد قائمة بمعرفات الصور المحذوفة ، إلى جانب الفشل إذا كان هناك أي منها.

طريقة الجدولة لحذف صور ECR

إذا كنت مهندسًا في DevOps أو تدير AWS ECR بانتظام ، فستعرف بالفعل متاعب حذف هذه الصور يدويًا.

إن تشغيل البرنامج النصي / الأمر يجعل الأمور أسهل ، لكننا على يقين من أنك كنت ترغب في شيء من شأنه أن يحذف هذه الصور تلقائيًا من تلقاء نفسها دون الحاجة إلى القلق بشأنها.

  كيفية إنشاء إنستغرام يسلط الضوء على الخاصة بك

أخبار جيدة ، تقدم AWS ECR سياسة دورة الحياة لصورك ، والتي يمكنك تعيينها لحذف هذه الصور في الوقت المناسب أو بطريقة مجدولة. دعونا نرى كيف نفعل ذلك.

الطريقة الأولى: طريقة واجهة المستخدم الرسومية!

الخطوة 1: توجه إلى المستودع حيث تريد تعيين نهج دورة الحياة. في اللوحة اليمنى ، يمكنك رؤية نهج دورة الحياة. يمكنك النقر فوقه للبدء.

الخطوة 2: يمكنك النقر فوقه وإنشاء قاعدتك الأولى.

الخطوة 3: يسمح لك ECR بحذف الصور بشرطين ، أحدهما إذا كانت صورك قديمة أو إذا تم وضع علامة عليها / بدون علامات ، وتريد الاحتفاظ بها فقط لعدد X من الأيام ، على سبيل المثال.

دعونا نرى كيف يتم ذلك. يمكنك الآن تعيين ما إذا كنت تريد حذف الصور غير المميزة إذا كانت يومًا ما أو أقدم أو إذا كان عدد الصور للصور غير المميزة يتجاوز واحدًا.

اختر وفقًا لحالة الاستخدام الخاصة بك. لا تنسى؛ يمكنك زيادة هذه الأرقام إلى الرقم الذي تختاره. حفظ لتشغيل قاعدة دورة الحياة.

الطريقة 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. بدون علامة يتطلب حذف tagPrefixList.

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

إذا تم وضع علامة “tagStatus” على “tagStatus” ، فإن سياسة دورة الحياة تتطلب قائمة بادئات علامات الصورة مفصولة بفواصل.

باستخدام prod بادئة العلامة ، يمكنك تحديد جميع الصور التي تم تمييزها prod ، و prod1 ، و prod2 ، وما إلى ذلك. تنتقي العلامات المتعددة الصور التي تحتوي على جميع العلامات فقط.

countType (Type: string, Required: yes):

حدد countNumber إذا كان countType هو imageCountMoreThan للحد من عدد الصور في المستودع الخاص بك.

  كيفية إرسال تحديث موقع إلى محادثة مجموعة Skype

حدد 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):

اختر نوع الإجراء. القيمة التي يمكن استخدامها هي “expire”.

إليك “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"

الطريقة الثالثة: طريقة البرمجة!

سنستخدم الأمر 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 الخاص بك.