継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

ECR から不要なイメージを安全に削除する ecrm を検証してみた

タダです.

ECR のライフサイクルを使用して不要なコンテナイメージを削除する運用をしていて,特定の ECS タスクで使用していたコンテナイメージを削除してしまってタスクの起動が失敗する事象が発生しました.本件の再発防止を検討する際 CLI ツールの ecrm をチームで教えてもらいました.自分は初めて知ったので,どのように ECR からコンテナイメージを削除するのかを試しながら学んだことを本記事でまとめていきます.

github.com

下記のブログでツールの詳細が紹介されています.

techblog.kayac.com

ローカルに ecrm をインストール

自分の環境はMac なので brew install fujiwara/tap/ecrmecrm をインストールできます.コマンドのヘルプを実行してみると以下の結果がでます.

$ 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 をローカルで試した内容をまとめました.