🐈

Terraformでリソース不整合になったときにはstate rmで解決するかもしれない

2022/07/14に公開

※注意 terraform state rm で解決するのはおそらく場合によります

状況

tfファイルでresourceAとresourceBが同じ実リソースを向いてしまってて、その状態でplanがno changeになる状況。

具体的なイメージはこんな感じ。
同じ名前のDBユーザを作ろうとしてしまった感じですね(これ自体は設定ミス)

# resourceA
resource "google_sql_user" "dbuserA" {
  name     = "hoge" # > 同じユーザを作ろうとしてしまっている!
  instance = "instance1"
  password = "hogepass"
}
# resourceB
resource "google_sql_user" "dbuserB" {
  name     = "hoge" # > 同じユーザを作ろうとしてしまっている!
  instance = "instance1"
  password = "hogepass"
}

片方を消そうとすると…

上記の状態で普通に片方(ex. dbuserB) を消そうとすると、同じDBユーザの hoge ユーザを消そうとしてしまいます。
hoge ユーザは残すのが正しいので、消されてしまっては困りますね。。


解決方法: terraform state rm

この状態になった場合、terraformが管理しているstateファイルからdbuserBだけを消しちゃえばOK。実リソースには影響が無いので気にせず実行してしまって大丈夫です。
https://www.terraform.io/cli/commands/state/rm

# dry runで `google_sql_user.db_userB` を消そうとしてみる
terraform state rm -dry-run google_sql_user.db_userB

# tfファイルとstateから指定したリソースを消してしまいます(実リソースには影響なし)
terraform state rm google_sql_user.db_userB

# moduleバージョンはこちら
terraform state rm module.[モジュール名].google_sql_user.db_userB

これで無事不整合解消できました 🎉

Discussion