🐳

【コスト削減】Artifact Registryのクリーンアップポリシーを使って、古いコンテナイメージを自動で削除する。

2024/05/24に公開

Google Cloudでコンテナイメージを扱う場合、その保管先として使われるのがArtifact registryです。
ただ、コンテナイメージを保管していくとどんどん古いイメージが残ってしまい、いずれ無料枠を超える容量に達してしまいます。
どんどんコストがかかっていくんですよね。。

しかしGoogle Cloudでは自動で古いコンテナイメージを削除する「クリーンアップポリシー」というものがあります。

今回はそのクリーンアップポリシーを用いて、自動で古いコンテナイメージを削除する方法をまとめました。

Artifact Registryとは?

Artifact RegistryとはDockerのコンテナイメージを補完し管理出来るGoogle Cloudのサービスです。
ここに保管したイメージをCloudRunやCloudRunJobsに連携してアプリケーションを運用、実行できます。

またCloud Buildというサービスと連携することで、自動でコンテナイメージを保管し、CloudRunなどに自動デプロイを設定することも可能です。

この辺インフラに慣れてなくてもサクッと構築できたりするので、後日やり方をまとめようかなと。

また、似たものでContainer Registryというサービスがありますが、こちらは非推奨でArtifactRegistryを使うように推奨されています。

詳細はこちら
https://cloud.google.com/artifact-registry/docs/overview?hl=ja

Google Cloudでコンテナイメージを扱う場合はArtifactRegistryが必須になるということですね。

Artifact Registryの料金

気になる料金ですが、構成は以下の3種類に分類されます。

  • 保存容量 (ストレージ)
  • データ転送
  • 脆弱性スキャン

データ転送については同じロケーション内であれば無料で使用できます。

ここで課金が発生する可能性があるのは、ストレージです。

容量が0.5GBまでは無料ですが、それを超えると1GB単位で毎月$0.10ほどかかります。

詳細はこちら
https://cloud.google.com/artifact-registry/pricing?hl=ja

僕の場合、コンテナイメージを3種類ほど運用していて、1つのイメージにつき11MBほどなので、全て合わせても30~50MBほどです。
無料枠内の.5GBを超えることはありません。

しかしArtifactRegistryは特に設定をしないと、最新のコンテナイメージを反映するごとに、古いコンテナイメージが残っていきます。

この使わなくなったイメージが積み重なっていくと余裕で0.5GBを超えていきます。

なので古いコンテナイメージは削除していく必要があるのですが、これ、自動でやって欲しいですよね。。

それが出来るのがクリーンアップポリシーです。

クリーンアップポリシーとは?

クリーンアップポリシーとは、Artifact Registryに保存されたコンテナイメージ等を、事前に設定した内容をもとに自動で削除する機能です。

詳細はこちら
https://cloud.google.com/artifact-registry/docs/repositories/cleanup-policy?hl=ja

削除ポリシーと保持ポリシー

クリーンアップポリシーには以下の2種類を設定するようになっています。

  • 削除ポリシー
  • 保持ポリシー

これらはその名の通り、イメージの削除・保持の条件をそれぞれ設定するものです。

注意点として、保持ポリシーのみ設定した場合は、何も削除されないという点です。
削除ポリシーを設定しないとイメージの削除は実行されません。

なので例えば、「最新の2つのイメージを保持してそれ以外は全て削除する」ということをしたい場合は

  • 削除ポリシー: タグの有無を問わずイメージを削除
  • 保持ポリシー: 最新の2つのバージョンのみ保持

という設定をする必要があります。

具体的な設定方法については後述します。

制約

クリーンアップポリシーに以下の制約があります。

  • クリーンアップポリシーによる削除と保持が実行されるのは、1日に1回 (どのタイミングで実行されるかは不明)
  • 削除ポリシーによってトリガーされる削除は、リポジトリごとに、最大30,000件/日
  • リポジトリあたりのクリーンアップポリシーの数は最大10個まで

この際注意して欲しいのが、クリーンアップポリシーが実行されるのが1日に1回だけということです。
また1日の中のどの時間帯で実行されるかは明らかではないので、タイミングによってはコンテナイメージを削除されない場合もあります。

CloudBuildやGithub Actionsなどで、mainリポジトリが更新されるたびにArtifactRegistryに反映するように自動化している場合、1日に何度も反映をしていると、場合によってはコンテナイメージが削除されずに残る場合があります。

翌日には再度ポリシーは実行されて削除はされますが、消されていない間にストレージの容量が圧迫されてしまうと課金額が増える可能性もあるので注意です。

自動削除の設定

自動削除の条件

今回は、以下の内容でコンテナイメージを自動削除するように設定します。

  • 最新の2つのコンテナイメージのみを残し、それ以外のイメージは削除する

そのため、削除ポリシーと保持ポリシーを以下の内容で設定します。

  • 削除ポリシー: タグの有無を問わずイメージを削除
  • 保持ポリシー: 最新の2つのバージョンのみ保持

設定方法

リポジトリを開く

Google Cloudにアクセスして、Artifact Registryのページに移動します。
リポジトリの一覧が出てくるので、対象のリポジトリを選択します。

「リポジトリの編集」をクリック

下にスクロールして、「クリーンアップ ポリシー」の「アーティファクトを削除」を選択

ここから削除ポリシーと保持ポリシーを設定します。

「クリーンアップポリシーを追加」をクリックしてください。

まず削除ポリシーです。

「名前」を記入し、「条件付き削除」を選択してください。
タグの状態は「タグの状態を問わない」のままにします。

最後に右下の完了をクリックします。

次に保持ポリシーです。
新規でポリシーを作るので、再度「クリーンアップポリシーを追加」をクリックしてください。

「名前」を記入し、ポリシータイプは「最新バージョンを保持」を選択
保持数は「2」としましょう。

最後に右下の完了をクリックします。

最後に下にある「更新」ボタンをクリックすれば完了です。

ポリシーが実行されるタイミングはランダムですが、しばらく経つとリポジトリにあるイメージが最新の2つのバージョンのみになります。

まとめ

クリーンアップポリシーを設定することで、古いコンテナイメージを自動で削除できるようになりました。

ArtifactRegistryを使う場合はこれを設定して無駄な課金をしないように注意しましょう。

Discussion