タダです.
ECR のライフサイクルを使用して不要なコンテナイメージを削除する運用をしていて,特定の ECS タスクで使用していたコンテナイメージを削除してしまってタスクの起動が失敗する事象が発生しました.本件の再発防止を検討する際 CLI ツールの ecrm
をチームで教えてもらいました.自分は初めて知ったので,どのように ECR からコンテナイメージを削除するのかを試しながら学んだことを本記事でまとめていきます.
下記のブログでツールの詳細が紹介されています.
ローカルに ecrm をインストール
自分の環境はMac なので brew install fujiwara/tap/ecrm
で ecrm
をインストールできます.コマンドのヘルプを実行してみると以下の結果がでます.
$ ecrm -h Usage: ecrm <command> [flags] Flags: -h, --help Show context-sensitive help. -c, --config="ecrm.yaml" Load configuration from FILE ($ECRM_CONFIG) --log-level="info" Set log level (debug, info, notice, warn, error) ($ECRM_LOG_LEVEL) --[no-]color Whether or not to color the output ($ECRM_COLOR) --version Show version. Commands: generate [flags] Generate a configuration file. scan [flags] Scan ECS/Lambda resources. Output image URIs in use. plan [flags] Scan ECS/Lambda resources and find unused ECR images that can be deleted safely. delete [flags] Scan ECS/Lambda resources and delete unused ECR images. version [flags] Show version. Run "ecrm <command> --help" for more information on a command.
コンテナイメージの定義ファイルを生成する
ecrm generate
で生成可能で ecrm.yaml
が追加されます.以下の内容はプライベートアカウント内の ECS/Lambda で利用しているコンテナイメージを抽出してくれます.
clusters: - name: example task_definitions: - name_pattern: hello-* keep_count: 5 - name_pattern: sample-* keep_count: 5 lambda_functions: - name_pattern: hello-* keep_count: 5 repositories: - name_pattern: hello-* expires: 30d keep_count: 5 keep_tag_patterns: - latest - name_pattern: sample-* expires: 30d keep_count: 5 keep_tag_patterns: - latest
上記の設定ですと以下の条件外のコンテナイメージが削除されます.
- ECSタスク定義に含まれるもの
- 最新から5世代で使用されているコンテナイメージを保持
- 実際にECSサービスやタスクで利用中のものがあれば保持
- Lambda関数で指定されているもの
- 最新バージョンから5世代で使用されているコンテナイメージを保持
- イメージがプッシュされれてから30日以内のコンテナイメージを保持
- イメージに
latest
タグが付いているものを保持
削除対象のコンテナイメージを確認する
ecrm
で削除されるコンテナイメージを確認するには ecrm plan
を使用します.以下はその結果ですが,EXPIRED
列でマイナスされた値が削除されるコンテナイメージの数と容量を表しています.sample-image という ECR のコンテナイメージが1つ削除される状況ですね.
REPOSITORY | TYPE | TOTAL | EXPIRED | KEEP ---------------------------------------------------------------------------+-------------+------------+-------------+-------------- hello-server | Image | 0 (0 B) | | 0 (0 B) sample-image | Image | 5 (116 MB) | -1 (43 MB) | 4 (74 MB)
コンテナイメージを削除してみる
コンテナイメージを削除するには ecrm delete
で実行可能です.インタラクティブに確認しながら削除することが可能です.自動化する場合は --force
オプションを指定すれば削除対象のコンテナイメージを強制的に削除してくれます.
$ ecrm delete ~中略~ 2024/11/24 14:06:59 [notice] Deleting sample-image sha256:e405d9249cfaf9bdaad043633a58cea1f1b68c5193c6deb30f131901b014d834 2024/11/24 14:06:59 [info] Deleted 1 images on sample-image Do you delete 45 images on simple-express-repository? (y/n) [n]: y 2024/11/24 14:06:59 [notice] Deleting sample-image sha256:e405d9249cfaf9bdaad043633a58cea1f1b68c5193c6deb30f131901b014d834 2024/11/24 14:06:59 [info] Deleted 1 images on sample-image
まとめ
ECR のコンテナイメージを安全に削除するための CLI ツール ecrm
をローカルで試した内容をまとめました.