จะลบ AWS ECR Untagged และรูปภาพที่เก่ากว่าได้อย่างไร
เผยแพร่แล้ว: 2022-09-07Amazon ECR ผสานรวมกับ Amazon Elastic Kubernetes Service (Amazon EKS), Amazon Elastic Container Service (Amazon ECS) และ AWS Lambda ทำให้การพัฒนาของคุณไปสู่เวิร์กโฟลว์การผลิตง่ายขึ้น
Amazon ECR โฮสต์อิมเมจในสถาปัตยกรรมที่ปรับขนาดได้สูงและพร้อมใช้งาน ช่วยให้คุณปรับใช้คอนเทนเนอร์สำหรับแอปพลิเคชันของคุณได้อย่างน่าเชื่อถือ สิ่งสำคัญคือต้องลบรูปภาพที่ไม่ติดแท็กและรูปภาพเก่าเพื่อรักษาสุขอนามัย
วันนี้ แอปพลิเคชันทำงานเป็นไมโครเซอร์วิส คำว่า micro-service เป็นเพียงคอนเทนเนอร์ที่บรรจุโค้ดทั้งหมดและการพึ่งพา ดังนั้นแอปพลิเคชันจึงสามารถทำงานได้อย่างรวดเร็วและเชื่อถือได้ในสภาพแวดล้อมการประมวลผลใดๆ เนื่องจากสะดวกในการพกพา ขนาดเล็ก และสะดวก คอนเทนเนอร์จึงเป็นทางเลือกสำหรับการขนส่งแอพพลิเคชั่นที่ทันสมัย
คอนเทนเนอร์ได้รับการออกแบบจากเทมเพลตแบบอ่านอย่างเดียวที่เรียกว่ารูปภาพ รูปภาพเหล่านี้จำเป็นต้องจัดเก็บไว้ที่ใดที่หนึ่งเพื่อให้สามารถเรียกค้นได้โดยเครื่องใดๆ ที่ได้รับอนุญาตให้ใช้งาน
นั่นคือที่มาของการลงทะเบียนคอนเทนเนอร์ ไม่นานมานี้ ผู้คนใช้ DockerHub เพื่อจัดเก็บภาพและสิ่งประดิษฐ์เหล่านี้ แต่ถ้าคุณใช้บริการคลาวด์ของ AWS ฉันแน่ใจว่าคุณใช้ AWS ECR อยู่แล้ว ซึ่งเป็นทางเลือกแทน DockerHub
AWS ECR คือรีจิสตรีคอนเทนเนอร์ที่มีการจัดการเต็มรูปแบบซึ่งให้การโฮสต์ที่มีประสิทธิภาพสูง ช่วยให้คุณสามารถปรับใช้อิมเมจของแอปพลิเคชันและอาร์ติแฟกต์ในรูปแบบของที่เก็บสาธารณะและส่วนตัว
ทุกวัน แอปพลิเคชันที่โฮสต์โดย AWS หลายรายการจะผลักและดึงรูปภาพ/สิ่งประดิษฐ์ของแอปพลิเคชันหลายล้านรายการเข้า/ออกจากที่เก็บ ECR เฉพาะ
ในบทความนี้ เราจะพูดถึงวิธีล้าง AWS ECR ที่เก่าและล้าสมัย และรักษาที่เก็บ ECR ให้สะอาดอยู่เสมอ
ความต้องการ: ลบรูปภาพที่ไม่ได้แท็กและเก่าออกเดี๋ยวนี้!
เหตุผลหลักในการทำความสะอาดที่เก็บ ECR คือสุขอนามัยในการพัฒนา ไม่ว่าเวลาใด จะไม่มีใครต้องการเก็บรูปภาพที่เก่ากว่าการปรับใช้สิบรายการใน ECR ของตน เป็นเพราะการย้อนกลับมักเกิดขึ้นในอุตสาหกรรม แต่การย้อนกลับที่ย้อนกลับการเปลี่ยนแปลงจาก 5 สิ่งประดิษฐ์ก่อนหน้านี้นั้นหายาก
ในแง่ที่ง่ายกว่า รูปภาพ/อาร์ติแฟกต์ใดๆ ที่การใช้งานเก่ามากกว่าห้ารายการจะไม่มีประโยชน์ อาจมีการเปลี่ยนแปลงในรายงานกลยุทธ์ขององค์กรของคุณ แต่เราไม่แนะนำว่าเป็นแนวทางปฏิบัติที่ดีที่สุด
ทั่วทั้งอุตสาหกรรม การติดแท็กใช้เพื่อระบุรูปภาพล่าสุดหรือห้าภาพล่าสุดที่เสถียรที่สุด เนื่องจากเป็นส่วนหนึ่งของวงจรชีวิตการพัฒนาซอฟต์แวร์ รูปภาพจะถูกสร้างขึ้นอย่างรวดเร็ว และแท็กเหล่านี้จะถูกแทนที่ด้วยรูปภาพใหม่ ทำให้รูปภาพเก่าไม่ติดแท็กและไร้ประโยชน์
ในสถานการณ์เช่นนี้ ซึ่งรูปภาพ/สิ่งประดิษฐ์มีขนาดใหญ่ ก็จะเพิ่มค่าบริการพื้นที่จัดเก็บใน ECR ด้วย ราคาของ AWS ECR คือ “0.10 ดอลลาร์ต่อ GB / เดือนสำหรับข้อมูลที่จัดเก็บไว้ในที่เก็บส่วนตัวหรือสาธารณะ”
ราคานี้อาจดูเล็กน้อยสำหรับคุณ แต่อย่างที่พวกเขาพูด หยดประกอบเป็นมหาสมุทร รูปภาพทั้งหมดเหล่านี้ หากจัดเก็บไว้เป็นเวลานาน จะเพิ่มใบเรียกเก็บเงินที่สูงกว่าในใบแจ้งหนี้ AWS ของคุณ
คำแนะนำคือให้ล้างรูปภาพเก่าและไม่ได้แท็กเหล่านี้ออกจากที่เก็บ ECR ของคุณ เพราะคุณไม่ต้องการมัน! เรียบง่าย! จะเก็บไว้ทำไม จ่ายทำไม?
การลบอิมเมจ AWS ECR ด้วยตนเอง
วิธีที่ 1: วิธี GUI!
ขั้นตอนที่ 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

ที่นี่เรากำลังทำสิ่งที่คล้ายกับสิ่งที่เราทำใน GUI เราจะลบภาพที่ติดแท็กเป็น custom-image-6 ที่อยู่ใน repository test-ecr-policy
วิธีที่ 3: วิธีการเขียนสคริปต์!
ข้อกำหนดเบื้องต้นสำหรับวิธีนี้คือต้องมีการกำหนดค่าคีย์ 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)
คำตอบจะให้รายการ ID รูปภาพที่ถูกลบพร้อมกับความล้มเหลวหากมี
วิธีการกำหนดเวลาลบอิมเมจ ECR
หากคุณเป็นวิศวกร DevOps หรือจัดการ AWS ECR เป็นประจำ คุณจะทราบถึงความยุ่งยากของการลบภาพเหล่านี้ด้วยตนเอง
การเรียกใช้สคริปต์/คำสั่งทำให้สิ่งต่างๆ ง่ายขึ้น แต่เราแน่ใจว่าคุณต้องการบางสิ่งที่จะลบภาพเหล่านี้โดยอัตโนมัติโดยที่คุณไม่ต้องกังวลกับมัน
ข่าวดี AWS ECR เสนอนโยบายวงจรการใช้งานสำหรับรูปภาพของคุณ ซึ่งคุณสามารถตั้งค่าให้ลบภาพเหล่านี้ในเวลาที่เหมาะสมหรือตามกำหนดการได้ เรามาดูวิธีการทำ
วิธีที่ 1: วิธี GUI!
ขั้นตอนที่ 1: ตรงไปที่ที่เก็บที่คุณต้องการตั้งค่านโยบายวงจรการใช้งาน ที่แผงด้านซ้าย คุณจะเห็นนโยบายวงจรการใช้งาน คุณสามารถคลิกที่มันเพื่อเริ่มต้น

ขั้นตอนที่ 2: คุณสามารถคลิกและสร้างกฎข้อแรกได้


ขั้นตอนที่ 3: ECR อนุญาตให้คุณลบรูปภาพได้สองเงื่อนไข เงื่อนไขหนึ่งคือหากรูปภาพของคุณมีอายุตามที่กำหนด หรือหากรูปภาพเหล่านั้นถูกแท็ก/ไม่ติดแท็ก และคุณต้องการเก็บรูปภาพเหล่านั้นไว้เป็นเวลา X จำนวนวันเท่านั้น
เรามาดูกันว่ามันทำอย่างไร ขณะนี้ คุณสามารถตั้งค่าได้ว่าต้องการลบรูปภาพที่ไม่ติดแท็กหากรูปภาพนั้นมีอายุหนึ่งวันขึ้นไป หรือหากจำนวนรูปภาพของรูปภาพไม่ติดแท็กเกินหนึ่งรูปภาพ
เลือกตามกรณีการใช้งานของคุณ อย่าลืม; คุณสามารถเพิ่มตัวเลขเหล่านี้เป็นจำนวนที่คุณเลือกได้ บันทึกเพื่อทริกเกอร์กฎวงจรชีวิต

วิธีที่ 2: วิธี CLI!
คำสั่ง AWS ECR CLI เพื่อกำหนดนโยบายวงจรชีวิตคือนโยบาย วงจรชีวิต
เรามาดูวิธีการทำ สำหรับสิ่งนี้ คุณต้องสร้างไฟล์ JSON ที่แสดงเงื่อนไขนโยบาย คุณสามารถตั้งชื่อเป็น policy.json หรือชื่อใดก็ได้ตามต้องการ
แต่ก่อนหน้านั้น มาดูองค์ประกอบของนโยบายวงจรชีวิตกัน
rulePriority (Type: integer, Required: yes):
ลำดับกฎจากล่างไปสูง กฎนโยบายวงจรการใช้งานที่มีลำดับความสำคัญหนึ่งจะถูกนำไปใช้ก่อน ตามด้วย 2 เป็นต้น กฎนโยบายวงจรการใช้งานแต่ละข้อต้องมีค่ากฎที่ไม่ซ้ำกัน
กฎนโยบายไม่ต้องการค่าที่ต่อเนื่องกัน กฎที่ติดแท็กใด ๆ ต้องมี rulePriority สูงสุดและได้รับการตรวจทานล่าสุด
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” เป็น “tagged” นโยบายวงจรการใช้งานของคุณกำหนดให้รายการคำนำหน้าแท็กรูปภาพคั่นด้วยเครื่องหมายจุลภาค
การใช้คำนำหน้าแท็ก 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 หลายแห่งได้อย่างไร
มักมีคำถามเกี่ยวกับวิธีการนำนโยบายเดียวกันไปใช้กับที่เก็บหลายแห่ง
การกำหนดนโยบายด้วยตนเองเป็นงานที่ซ้ำซากและน่าเบื่อ
นี่คือข้อมูลโค้ดที่ใช้ในระบบการผลิตจริงเพื่อใช้นโยบายกับที่เก็บมากกว่า 100 แห่ง
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 Learning ของคุณได้