Terraformで、 resource 名のみを変更したいけど、変更すると destroy --> create と再作成されてしまい、既に運用中のリソースとかだとすごく都合が悪かったりする。そんな時の対処法

1. state mv する方法

terraform に標準で用意されているコマンド、 terraform state mv を使用する方法

  • リソース名変更対象が少ない場合(1~5個ぐらい)
  • 個人で使ってるTerraform環境など、自分1人で好き勝手やっていい環境の場合

のような場合は、この方法の方が気楽に出来て良い

実行方法

コマンドラインで以下を実行するだけ

1
$ terraform state mv [変更前のリソース名] [変更後のリソース名]

2. moved blockを使う方法

moved blockを記述する方法

  • リソース名変更対象が大量にある場合
  • 共通moduleとして複数Workspaceで参照されているリソースのリソース名変更の場合(moved blockはmoduleに対応してる)
  • チームでリポジトリなどを使ってTerraformを使用していたり、レビューなどが必要な場合

のような場合は、この方法の方が通常の更新フローに乗せて対処できるので良い

実行方法

例えば、moved.tf というファイルをWorkspaceのルートに(複数Workspaceがある場合はリソース名変更が必要なところにすべてに)作成し、以下のように記述する(ファイル名や置き場所はなんでもよいらしいが、このようにするのがお作法っぽい)

1
2
3
4
moved {
from = [変更前のリソース名]
to = [変更後のリソース名]
}

書いたらそのままコミットして、Pull Requestを出すなど、通常の開発フローに乗せて更新を行う

その後、Applyした後は上記で書いた物は不要になるので、後付けで削除する