Terraformで ArtifactRegistry の Cleanupポリシー を変更すると謎の差分が発生する原因と回避策

2025/05/08に公開されました。
2025/05/08に更新されました。

Terraformで Artifact Registry の Cleanupポリシーを変更するとバグで差分が発生するため、原因と回避策を記載します。


author: kuribo-

はじめに

インフラチームのkuribo-です。

GCPとTerraformを日々触っている皆さん、CI/CDでArtifact Registryを使っている方も多いのではないでしょうか。
今回は、Artifact RegistryリソースのCleanupポリシーを変更しようとした際に遭遇した、困った挙動と、その回避策について紹介します。

該当のIssueはこちらです。もしかしたら現在この記事を読んでいる方がこのIssueを読む頃にはクローズされている可能性はありますが、同じようにハマってしまった方の助けになれば幸いです。

何が起きたのか?

Artifact Registryのリポジトリ設定をTerraformで管理していて、Cleanupポリシーのを修正しようとしたのが始まりです。
具体例として、以下のようなTerraformコードを書いて apply していました。

resource "google_artifact_registry_repository" "image" {
  location      = var.location
  repository_id = "docker-repo"
  description   = "docker repository"
  format        = "DOCKER"

  docker_config {
    immutable_tags = false
  }
  cleanup_policies {
    id     = "delete-untagged"
    action = "DELETE"
    condition {
      tag_state  = "UNTAGGED"
      older_than = "30d"
    }
  }
  cleanup_policies {
    id     = "delete-tempry-tags"
    action = "DELETE"
    condition {
      tag_state    = "TAGGED"
      tag_prefixes = ["pr-", "pre-"]
      older_than   = "30d"
    }
  }
}

delete-tempry-tags がTypoしているので、 delete-temporary-tags に修正して terraform plan を実行すると、こんな差分が出てきます。

  ~ resource "google_artifact_registry_repository" "image" {
        id                     = "projects/inhouse-prj-ghost-writer-ai/locations/asia-northeast1/repositories/docker-repo"
        name                   = "docker-repo"
        # (13 unchanged attributes hidden)

      - cleanup_policies {
          - action = "DELETE" -> null
          - id     = "delete-tempry-tags" -> null

          - condition {
              - older_than            = "2592000s" -> null
              - package_name_prefixes = [] -> null
              - tag_prefixes          = [
                  - "pr-",
                  - "pre-",
                ] -> null
              - tag_state             = "TAGGED" -> null
              - version_name_prefixes = [] -> null
                # (1 unchanged attribute hidden)
            }
        }
      + cleanup_policies {
          + action = "DELETE"
          + id     = "delete-temporary-tags"

          + condition {
              + older_than            = "30d"
              + package_name_prefixes = []
              + tag_prefixes          = [
                  + "pr-",
                  + "pre-",
                ]
              + tag_state             = "TAGGED"
              + version_name_prefixes = []
                # (1 unchanged attribute hidden)
            }
        }
      + cleanup_policies {
        }
  }

おわかりいただけただろうか。
差分の最後の方で謎の空っぽの cleanup_policies ブロックを新たに作成しようとしているのです。

この空の cleanup_policies ブロックはGoogleのAPI的には不正な定義となるため、
このまま terraform apply を実行するとエラーとなり、リソースの修正が不可能という詰んだ状態になってしまいます。

どうすれば解決できるのか?

Issueがオープンなうちは、Terraform Provider側の修正を待つ必要がありますが、それまでの暫定的な回避策としては、以下の手順で対応できます。

  1. GCPコンソールから手動で該当のクリーンアップポリシーを削除する
    • 対象のArtifact Registryリポジトリの詳細画面を開く
    • 「クリーンアップポリシー」タブを選択
    • 問題のポリシー(この場合は delete-tempry-tags、あるいは修正後の delete-temporary-tags も影響を受けている場合はそれも)を特定し、手動で削除
  2. 再度 terraform apply を実行する
    • 手動でポリシーを削除したことにより、Terraformが期待する状態との差分が空のポリシーブロックを含まない形になり、正常に apply できるようになるはず

根本的な解決ではないものの、これでひとまずはTerraformでの管理下にリソースを戻すことができます。

おわりに

今回は、Terraformで google_artifact_registry_repositorycleanup_policies を変更しようとした際に
発生する可能性のある問題と、その回避策についてご紹介しました。
Terraform Providerのバグは時々遭遇するものですが、Issueを確認したり、今回のように手動での回避策を探したりすることで、なんとか乗り越えていきたいですね。

この記事が、同じ問題に直面した誰かの一助となれば幸いです。
そして、Issueが早期に解決されることを願っています!

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

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