Closed5

【Terraform】Error: Provider produced inconsistent result after apply

Tomoyuki KatoTomoyuki Kato

terraform applyした時の以下のエラーについて。
CloudSQLに変更を加えたときに起きた

│ Error: Provider produced inconsistent result after apply
│ 
│ When applying changes to xxxxx, provider
│ "provider[\"registry.terraform.io/hashicorp/google\"]" produced an
│ unexpected new value: Root resource was present, but now absent.
│ 
│ This is a bug in the provider, which should be reported in the provider's
│ own issue tracker.
Tomoyuki KatoTomoyuki Kato

プロバイダーのバグだから、こちらで直せないのかな?
This is a bug in the provider, which should be reported in the provider's
own issue tracker.

Tomoyuki KatoTomoyuki Kato

基本的にはプロバイダー起因のバグだが、迂回策があるっぽい。
リソースが作成される前に約 200 秒の遅延を追加することで解決したとのこと
https://www.googlecloudcommunity.com/gc/Databases/Issue-with-applying-MySQL-IAM-user-on-GCP-Cloud-SQL/m-p/597791

上記リンクの解決策を要約するとこんな感じ。

<問題の概要>

  • エラーメッセージ「Provider produced inconsistent result after apply」は、Terraformのプロバイダーに関連する既知の問題
  • Terraformのプロバイダーはリモートシステム(このケースではGoogle Cloud SQL)とのやり取りを行うプラグインのこと
  • リソースが作成または更新される際、リモートシステムが新しく作成または更新されたリソースの情報を十分に迅速に保存できない一時的な状況が発生する可能性があり、これにより、Terraformの状態とインフラストラクチャの実際の状態との間に矛盾が生じることがある

<推奨される解決策>

  • GitHub上でTerraformプロバイダーのメンテナに問題を報告することです。

<回避策>
* 回避策=メンテナが問題に取り組んでいる間に我々ができること

  • エラーメッセージに記載されているリソースをリモートシステム上で手動で削除し、その後に再度apply操作を行うこと

<具体的な例>

  • google_sql_user リソースの作成前に約200秒の遅延を加えることで解決したとのこと。
  • この遅延は、データベースインスタンスがオンラインになり、新しいユーザーの作成を受け入れる準備ができるまでの時間を確保する

実装イメージはこんな感じ。

resource "google_sql_database_instance" "master" {
}

resource "time_sleep" "wait" {
  create_duration = "200s"
  depends_on = [google_sql_database_instance.master]
}

resource "google_sql_user" "users" {
  depends_on = [time_sleep.wait]
}
Tomoyuki KatoTomoyuki Kato

作り直してもエラーは直らず。

どうやらsql_userのnameに特定の記号が入っている場合(例えば「」とか)、GCPのコンソールからはsql_userを作れるが、Terraform経由だと表題のエラーが出るっぽい。

つまりTerraform起因だから「This is a bug in the provider, which should be reported in the provider's」という表示がされているわけなのであれば納得。

このスクラップは3ヶ月前にクローズされました