Closed16

Terraform で Cloud Run のリビジョンを更新しようとすると Modifying のまま進まなくなる事象の原因調査

ささむくささむく

事象概要

terraform apply すると、このメッセージが永遠に出続ける。期間が 10m になっても 20mになっても終わらない。

google_cloud_run_service.cloud_run: Still modifying... [id=locations/asia-northeast1/namespaces/XXXX/services/cloudrun-service, 20s elapsed]
ささむくささむく

発生条件

Terraform からプロビジョニングした Cloud Run サービスに対し、gcloud コマンドや Webコンソールから新規リビジョンを発行することが条件の模様。一度 Terraform 外から発行されたリビジョンを持つ Cloud Run サービスに対し、再度 Terraform で構成変更 (例えば Docker イメージの変更)をしようとすると事象が再現する。

ささむくささむく

調査結果

このオプションが Cloud Run に必要だった。
autogenerate_revision_name = true

ささむくささむく

意味はないと分かっているが、一応、Modifying 状態で 30m くらい待ってみる。

ささむくささむく

エラーメッセージが出てた!
「違うコンフィグを持つ同名のリビジョンが既に存在しますよ」

│ Error: Error updating Service "locations/asia-northeast1/namespaces/XXXX/services/cloudrun-service": googleapi: Error 409: Revision named 'cloudrun-service-00003-vir' with different configuration already exists.
ささむくささむく

autogenerate_revision_name = true ← これをつけてリビジョン名を変えればいけるのでは?

autogenerate_revision_name - (Optional) If set to true, the revision name (template.metadata.name) will be omitted and autogenerated by Cloud Run. This cannot be set to true while template.metadata.name is also set. (For legacy support, if template.metadata.name is unset in state while this field is set to false, the revision name will still autogenerate.)

https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/cloud_run_service

ささむくささむく

一旦、実態と tfstate の差分を解消してから 自動リビジョン命名を有効にする。

Terraform will perform the following actions:

  # google_cloud_run_service.cloud_run will be updated in-place
  ~ resource "google_cloud_run_service" "cloud_run" {
      ~ autogenerate_revision_name = false -> true
        id                         = "locations/asia-northeast1/namespaces/XXXX/services/cloudrun-service"
        name                       = "cloudrun-service"
        # (3 unchanged attributes hidden)



        # (3 unchanged blocks hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.
ささむくささむく

手動リビジョン更新し、tfstate との差分を作った状態で再トライ。

Terraform will perform the following actions:

  # google_cloud_run_service.cloud_run will be updated in-place
  ~ resource "google_cloud_run_service" "cloud_run" {
        id                         = "locations/asia-northeast1/namespaces/XXXX/services/cloudrun-service"
        name                       = "cloudrun-service"
        # (4 unchanged attributes hidden)


      ~ template {

          ~ spec {
                # (3 unchanged attributes hidden)

              ~ containers {
                  ~ image   = "asia.gcr.io/XXXX/hello@shaXXXX" -> "us-docker.pkg.dev/cloudrun/container/hello"
                    # (2 unchanged attributes hidden)


                    # (2 unchanged blocks hidden)
                }
            }
            # (1 unchanged block hidden)
        }

        # (2 unchanged blocks hidden)
    }

Plan: 0 to add, 1 to change, 0 to destroy.
ささむくささむく

うわああああああああ!!
更新できたああああ!!

Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
ささむくささむく

ただ、一個謎が残っている。

autogenerate_revision_name=falseの状態でも、これはできた。
TF: リビジョン作成
TF: リビジョン作成(コンテナイメージ変更)

でも、これはできない。
TF: リビジョン作成
手動: リビジョン作成(コンテナイメージ変更)
TF: リビジョン作成(コンテナイメージ変更)→ Error

つまり、autogenerate_revision_name は最初はtrueだが、手動を挟むことでfalseになる挙動に見える。

このスクラップは2021/09/11にクローズされました