如何刪除 AWS ECR 未標記和較舊的圖像?

已發表: 2022-09-07

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 存儲庫的主要原因是開發衛生。 在任何時候,沒有人願意在他們的 ECR 中保留超過 10 個部署的映像。 也是因為回滾在行業中經常發生,但是從之前的 5 個工件還原變化的回滾是很少見的。

簡而言之,任何超過五個部署的圖像/工件都是無用的。 貴組織的戰略報告可能會發生變化,但我們不建議將其作為最佳實踐。

在整個行業中,標記用於指定最穩定的最新圖像或最後五個最新圖像。 作為軟件開發生命週期的一部分,圖像會快速生成,並且這些標籤會被新圖像替換,而舊圖像則沒有標記且無用。

在這種情況下,圖像/工件很大,它還會增加 ECR 的存儲費用。 AWS ECR 的定價為“存儲在私有或公共存儲庫中的數據每 GB/月 0.10 美元”。

這個價格對你來說可能看起來很小,但正如他們所說,水滴構成了海洋。 所有這些圖像,如果存放時間較長,將會在您的 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 中所做的事情。 我們將刪除存儲庫 test-ecr-policy 中標記為 custom-image-6 的圖像。

方法 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)

響應將為您提供已刪除圖像 ID 的列表,以及失敗(如果有)。

刪除 ECR 圖像的調度方法

如果您是 DevOps 工程師或經常管理 AWS ECR,您將已經知道手動刪除這些映像的痛苦。

運行腳本/命令確實使事情變得更容易,但我們確信您會希望有一些東西可以自動刪除這些圖像而不必擔心它們。

好消息,AWS ECR 為您的圖像提供生命週期策略,您可以設置它以及時或按計劃刪除這些圖像。 讓我們看看怎麼做。

方法1:GUI方式!

第 1 步:前往要設置生命週期策略的存儲庫。 在左側面板上,您可以看到生命週期策略。 你可以點擊它開始。

第 2 步:您可以單擊它並創建您的第一條規則。

第 3 步: ECR 允許您在兩種情況下刪除圖像,一種是如果您的圖像已指定天數或是否已標記/未標記,並且您只想保留它們,例如 X 天。

讓我們看看它是如何完成的。 現在,您可以設置是否要刪除未標記的圖像,如果它們是一天或更早,或者未標記圖像的圖像計數超過一個。

根據您的用例選擇。 不要忘記; 您可以將這些數字增加到您選擇的數字。 保存以觸發生命週期規則。

方法 2:CLI 方式!

用於設置生命週期策略的 AWS ECR CLI 命令是put-lifecycle-policy。

讓我們看看怎麼做。 為此,您必須創建一個列出策略條件的 JSON 文件。 您可以將其命名為 policy.json 或您選擇的任何名稱。

但在此之前,讓我們看一下生命週期策略元素。

 rulePriority (Type: integer, Required: yes):

從低到高的規則順序。 首先應用優先級為 1 的生命週期策略規則,然後是 2,依此類推。生命週期策略規則必須具有唯一的規則值。

策略規則不需要連續值。 Any-tagged 規則必須具有最高的 rulePriority 並且最後被審查。

 description (Type: string, Required: no):

解釋生命週期策略中的規則的用途。

 tagStatus (Type: string, Required: yes):

它檢查添加的生命週期策略規則是否指定了圖像標籤。 標記、未標記或任何都可以。 如果未指定,則評估所有圖像。 Tagged 需要一個 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):

如果 countType 為 imageCountMoreThan,則指定 countNumber 以限制存儲庫中的圖像數量。

如果 countType 為 sinceImagePushed 則指定 countUnit 和 countNumber 以限制存儲庫的圖像。

 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"

方法 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 關鍵術語。