AWS ECR のタグ付けされていない古いイメージを削除する方法は?
公開: 2022-09-07Amazon ECR は、Amazon Elastic Kubernetes Service (Amazon EKS)、Amazon Elastic Container Service (Amazon ECS)、および AWS Lambda と統合されており、開発から本番までのワークフローを簡素化します。
Amazon ECR は、高度にスケーラブルで可用性の高いアーキテクチャでイメージをホストするため、アプリケーションにコンテナを確実にデプロイできます。 衛生状態を維持するために、タグ付けされていない古いイメージを削除することが重要です。
今日、アプリケーションはマイクロサービスとして実行されます。 マイクロサービスという用語は、アプリケーションがあらゆるコンピューティング環境で迅速かつ確実に実行できるように、すべてのコードとその依存関係をパッケージ化するコンテナーに他なりません。 コンテナは、携帯性、サイズの小ささ、便利さから、最新のアプリケーションを出荷するための最適な方法になりつつあります。
コンテナーは、イメージと呼ばれる読み取り専用のテンプレートから設計されています。 これらのイメージは、使用を許可された任意のマシンで取得できるように、どこかに保存する必要があります。
そこでコンテナ レジストリの出番です。少し前まで、人々は DockerHub を使用してこれらのイメージとアーティファクトを格納していました。 しかし、AWS クラウド サービスを使用している場合は、DockerHub の代替である AWS ECR を既に使用していると思います。
AWS ECR は、高パフォーマンスのホスティングを提供する完全マネージド型のコンテナ レジストリであり、アプリケーション イメージとアーティファクトをパブリックおよびプライベート リポジトリの形式でデプロイできます。
毎日、AWS がホストする複数のアプリケーションが、何百万もの画像/アプリケーション アーティファクトを特定の ECR リポジトリにプッシュおよびプルします。
この記事では、古い古い AWS ECR をクリアし、ECR リポジトリをクリーンに保つ方法について説明します。
必要性: タグ付けされていない古い画像を今すぐ削除してください!
ECR リポジトリをクリーンアップする主な理由は、開発の衛生管理です。 いつでも、ECR に 10 個より古い展開のイメージを保持したいと思う人はいないでしょう。 業界ではロールバックが頻繁に発生するためでもありますが、5 つ前のアーティファクトからの変更を元に戻すロールバックはまれです。
簡単に言えば、デプロイから 5 年以上経過したイメージ/アーティファクトは役に立たないということです。 組織の戦略レポートで変更される可能性がありますが、ベスト プラクティスとしてはお勧めしません。
業界全体で、タグ付けは、最も安定した最新または最新の 5 つのイメージを指定するために使用されます。 ソフトウェア開発ライフ サイクルの一環として、イメージは迅速に生成され、これらのタグは新しいイメージに置き換えられ、古いイメージはタグ付けされず、役に立たなくなります。
このような画像/アーティファクトが大きい状況では、ECR のストレージ料金も追加されます。 AWS ECR の料金は、「プライベートまたはパブリック リポジトリに保存されたデータに対して、GB あたり月額 0.10 ドル」です。
この価格はあなたには小さく見えるかもしれませんが、彼らが言うように、滴は海を構成します. これらすべてのイメージを長期間保管すると、AWS の請求額が高くなります。
古いタグの付いていないイメージは不要なので、ECR リポジトリから削除することをお勧めします。 単純! なぜそれを維持し、それを支払うのですか?
AWS ECR イメージを手動で削除する
方法 1: GUI 方式!
ステップ 1:アマゾン ウェブ サービス アカウントにログインし、クリアするリポジトリに移動します。

ステップ 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 では、2 つの条件でイメージを削除できます。1 つは、イメージが指定された日数経過した場合、またはイメージがタグ付けされている/タグ付けされていない場合で、たとえば X 日間だけ保持したい場合です。
それがどのように行われるか見てみましょう。 タグの付いていない画像が 1 日以上経過した場合、またはタグの付いていない画像の数が 1 を超えた場合に、タグの付いていない画像を削除するかどうかを設定できるようになりました。

ユースケースに合わせてお選びください。 忘れないで; これらの数を選択した数に増やすことができます。 保存して、ライフサイクル ルールをトリガーします。

方法 2: CLI 方式!
ライフサイクル ポリシーを設定する AWS ECR CLI コマンドは、put-lifecycle-policy です。
それを行う方法を見てみましょう。 このためには、ポリシー条件をリストした JSON ファイルを作成する必要があります。 policy.json または任意の名前を付けることができます。
しかしその前に、ライフサイクル ポリシーの要素を見てみましょう。
rulePriority (Type: integer, Required: yes):
ルールの順序が低いものから高いものへ。 優先度 1 のライフサイクル ポリシー ルールが最初に適用され、次に 2 というように適用されます。ライフサイクル ポリシー ルールには、それぞれ固有のルール値が必要です。
ポリシー ルールは、連続する値を必要としません。 タグ付けされたルールは、rulePriority が最も高く、最後に確認する必要があります。
description (Type: string, Required: no):
ライフサイクル ポリシーのルールの目的について説明します。
tagStatus (Type: string, Required: yes):
追加されたライフサイクル ポリシー ルールがイメージ タグを指定しているかどうかを確認します。 タグ付き、タグなし、何でもOKです。 何も指定されていない場合、すべてのイメージが評価されます。 Tagged には tagPrefixList 値が必要です。 タグなしでは、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 の主要な用語をいくつか調べることもできます。