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 | moved { |
書いたらそのままコミットして、Pull Requestを出すなど、通常の開発フローに乗せて更新を行う
その後、Applyした後は上記で書いた物は不要になるので、後付けで削除する