Artifact RegistryのCleanup Policyを使ってみる

2023/09/21に公開されました。
2023/09/21に更新されました。

まだGAになっていないARのCleanup Policyを使ってみる


author: kuribo-

はじめに

アプリチームのkuribo-です。久々の投稿です。
アプリチームですが、インフラのお仕事をやっていますので
インフラエンジニアらしい記事を書いていきます。

今回はArtifact RegistryのImage管理についてです。
Artifact RegistryにImageをPushし続けているといつの間にか膨大なImageが溜まってしまいます。
それらを適度に整理するための機能としてCleanup Policyという機能がPreviewで出ているので検証しました。

Artifact Registryとは

Artifact RegistryとはGCPにあるContainer Registryです。
ざっくり言うと、Docker Imageを保存しておけるリポジトリです。
docker.ioのようなものもありますが、固有のプロジェクト用のイメージなどはこちらに保存します。

Artifact Registry Cleanup Policyとは

Artifact Registryの1機能としてCleanup Policyという機能が追加されました。
タグやイメージ名、Hashダイジェストなどを指定して、
色々な条件を指定してイメージを削除や保持しておくなどを設定できるものです。
例えば、5世代だけ残して残りを削除するなども設定ができます。

Artifact Registry Cleanup Policyの仕様

Googleのドキュメントは以下です。
https://cloud.google.com/artifact-registry/docs/repositories/cleanup-policy?hl=ja

以下を組み合わせて保持や削除を指定する。

  • 対象のイメージを指定
    • 対象タグ(tagPrefixes)
    • 対象イメージ(packageNamePrefixes)
    • 対象ダイジェスト(versionNamePrefixes)
    • 一定期間を経過(olderThan)
    • 一定期間内のイメージ(newerThan)
  • 世代の指定(keepCount)
  • オブジェクトへの操作
    • 削除(Delete)
    • 保持(Keep)

その他に以下の機能もあります。

  • dry-run機能
    • AuditLogを有効化する必要あり

実際に試してみた

tagPrefixesの動作

gcloud artifacts repositories set-cleanup-plicies ar-cleanup-policy-test \
    --project=sandbox-kurihara-h \
    --location=asia-northeast1 \
    --policy=policy.json \
    --no-dry-run
Updated repository [ar-cleanup-policy-test].
Dry run is disabled.
[
    {
        "action": {
            "type": "DELETE"
        },
        "condition": {
            "tagPrefixes": [
                "test"
            ],
            "tagState": "TAGGED"
        },
        "name": "test1-delete-policy"
    }
]

testがついたタグが削除されるようになりました。
ですので、test1, test1-1などが対象になりました。
削除タイミングについてはつまづきポイントの方にまとめて記述。

packageNamePrefixesの動作

gcloud artifacts repositories set-cleanup-plicies ar-cleanup-policy-test \
    --project=sandbox-kurihara-h \
    --location=asia-northeast1 \
    --policy=policy.json \
    --no-dry-run
Updated repository [ar-cleanup-policy-test].
Dry run is disabled.
[
    {
        "action": {
            "type": "DELETE"
        },
        "condition": {
            "packageNamePrefixes": [
                "test"
            ],
            "tagState": "TAGGED"
        },
        "name": "test2-delete-policy"
    }
]

Imageにtestがつくものが削除されるようになりました。
test_app、test1_appなどのイメージ名のものが対象になりました。

versionNamePrefixesの動作

gcloud artifacts repositories set-cleanup-plicies ar-cleanup-policy-test \
    --project=sandbox-kurihara-h \
    --location=asia-northeast1 \
    --policy=policy.json \
    --no-dry-run
Updated repository [ar-cleanup-policy-test].
Dry run is disabled.
[
    {
        "action": {
            "type": "DELETE"
        },
        "condition": {
            "versionNamePrefixes": [
                "sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
            ],
            "tagState": "TAGGED"
        },
        "name": "test3-delete-policy"
    }
]

Imageのダイジェストの値と一致するものを削除するようです。
正直ここはハッシュ値なので予測もできず使いづらい気がします。

keep countの動作

gcloud artifacts repositories set-cleanup-plicies ar-cleanup-policy-test \
    --project=sandbox-kurihara-h \
    --location=asia-northeast1 \
    --policy=policy.json \
    --no-dry-run
Updated repository [ar-cleanup-policy-test].
Dry run is disabled.
[
    {
        "action": {
            "type": "KEEP"
        },
        "mostRecentVersions": {
            "keepCount": 3,
            "packageNamePrefixes": [
                "test"
            ]
        },
        "name": "keep-policy"
    },
    {
        "action": {
            "type": "DELETE"
        },
        "condition": {
            "tagPrefixes": [
                "test"
            ],
            "tagState": "TAGGED"
        },
        "name": "test1-delete-policy"
    }
]

3世代を残して全てのイメージが削除されます。

dry-runの確認

gcloud artifacts repositories set-cleanup-plicies ar-cleanup-policy-test \
    --project=sandbox-kurihara-h \
    --location=asia-northeast1 \
    --policy=policy.json \
    --dry-run
Updated repository [ar-cleanup-policy-test].
Dry run is enabled.
[
    {
        "action": {
            "type": "DELETE"
        },
        "condition": {
            "tagPrefixes": [
                "test"
            ],
            "tagState": "TAGGED"
        },
        "name": "test1-delete-policy"
    }
]

dry-runになっていると本当に動きません。
これで動かず、実行タイミングの問題なのかDry-runになっていたのかよくわからない時が何度かありました。
実行後に Dry run is enabled. という記載があるので見逃さないようにしましょう。

olderThanやnewerThanはイメージのできたタイミングを見て削除なので予測できるため検証せず。

つまづきポイント

  • 設定してもいつ実行されるのかはわからない。
    • ドキュメントにも実行タイミングは記載がありません。
    • Googleのサポートの方に伺っても明確な答えはありませんでした。
  • dry-runでset-policiesをした場合、no-dry-runを設定しない限り更新したポリシーは全てdry-runになる。
    • 毎回no-dry-runを設定した方が良さそう。
  • versionNamePrefixesはSHAダイジェストを対象としていた
    • 公式ドキュメントに記載されている内容がよくわからなかった。
      • 公式ドキュメントには versionNamePrefixes: VERSION_PREFIXES は、アーティファクト バージョンの接頭辞のカンマ区切りのリストです。たとえば、"v1", "v2" は、バージョン "v1.5"、"v2.0alpha"、"v10.2" と一致します。 と記載がされているがこれは間違い。(2023/09/21時点)
  • action.type.KEEPはDELETEが設定されていないと意味はない。
    • セットで設定すること。

まとめ

使ってみて思ったのは、tagPrefixes、packageNamePrefixes、keepCountの3つの設定ぐらいしか使わなさそうな気がする。
また、そのリポジトリ内の全てのアプリケーションを対象とするというような設定ができるとより良いと思った。
(packageNamePrefixes: ”*“のような設定)

おわりに

今まで自動削除する機能がなかったのがプレビューとはいえ実装されたのはとても嬉しい。
まだ若干使いづらかったりドキュメントがわかりづらいところはあるものの、これからGAになるタイミングで全てブラッシュアップされるといいと思った。


GI Cloud は事業の拡大に向けて一緒に夢を追う仲間を募集しています

当社は「クラウドで日本のIT業界を変革し、世の中をもっとハッピーに」をミッションに掲げ、Google Cloudに特化した技術者集団として、お客様にコンサルティングからシステム開発、運用・保守まで一気通貫でサービスを提供しています。

まだ小規模な事業体ですが、スタートアップならではの活気と成長性に加えて、大手総合商社である伊藤忠グループの一員としてやりがいのある案件にもどんどんチャレンジできる環境が整っています。成長意欲の高い仲間と共にスキルを磨きながら、クラウドの力で世の中をもっとハッピーにしたい。そんな我々の想いに共感できる方のエントリーをお待ちしています。

採用ページ

※本記事は、ジーアイクラウド株式会社の見解を述べたものであり、必要な調査・検討は行っているものの必ずしもその正確性や真実性を保証するものではありません。

※リンクを利用する際には、必ず出典がGIC dryaki-blogであることを明記してください。
リンクの利用によりトラブルが発生した場合、リンクを設置した方ご自身の責任で対応してください。
ジーアイクラウド株式会社はユーザーによるリンクの利用につき、如何なる責任を負うものではありません。