生涯未熟

生涯未熟

プログラミングをちょこちょこと。

gcr-cleanerを使って定期的にArtifact Registryのイメージを削除する

Artifact Registryの料金にはストレージ料金があり、0.5 GBを超えると1GBにつき$0.1がかかってきます。
微々たる料金ではありますが、運用を続けていくごとに見過ごすことは出来ないコストになる可能性があります。

cloud.google.com

そこで、GCPでも紹介されている gcr-cleaner を使ってこのコストを低減させてみます。

github.com

GitHub Actionsを作っていく

今回はお手軽にGitHub Actionsを使って、gcr-cleanerを定期実行させていきます。

作成を開始する前にgcr-cleanerについての簡単な説明ですが、様々な条件を元にContainer Registry / Artifact Registryのイメージを削除することができるツールで、条件には「イメージを最低でも3つは残す」や「正規表現に合致した特定のタグを持つイメージを削除」や「一ヶ月より前に作成されたイメージを削除」などが設定できたりします。

では、先に完成形のコードを。

こんな感じで作りました。 解説すると

  1. schedule: cronで毎日0:00に実行、かつ手動でも実行できるようにする
  2. google-github-actions/auth を用い、Workload Identity 連携を使って特定のサービスアカウントを利用しアクセスする
  3. gcr-cleanerで開発とステージングと本番のリポジトリ内のイメージを条件に従って削除
  4. 開発は「30日より前のイメージ」かつ「全てのタグを対象」を削除対象とし、最低でも5つのイメージは残す
  5. ステージング/本番は「30日より前のイメージ」かつ「全てのタグを対象」を削除対象とし、最低でも10つのイメージは残す

といったようなことをしています。
ステージング/本番はロールバックする可能性があるため、開発よりも多めにイメージを残しているといった感じですね。

他の方法

Artifact Registryにはクリーンアップポリシーが設定でき、これでリポジトリ内のイメージのライフサイクルを決めることができるのですが、pre-GAの機能なのでGAされれば使うのもいいかもしれないですね。
olderThan / newerThan で期間指定、 keepCount でイメージの保持も出来そうなので過不足はなさそう。