tfstateファイルの保存先を変更する際に行ったこと
こんにちは、CURUCURU エンジニアの兄山です。 今日は Terraform における tfstate の保存先を変更した際に、再作成を走らせることなく変更する方法を記事にまとめます。
あまり経験することがなく、記事もあまりありませんでしたのでお役に立てれば幸いです。 ※tfstate はリモート(AWS、GCP、Terraform Cloud 等のクラウドストレージサービス)に管理している前提でお話しします。
tfstate とは
Terraform で管理しているリソースの現在の状態を表す JSON ファイルです。
リモート管理したい際は下記のように、terraformブロックにbackendを指定するだけです。
次にterraform initを実行するとモジュールがインストールされます。
terraform {
  ...
  ...
  ...
  backend "gcs" {
    bucket = "hoge"
    prefix = "fuga/piyo"
  }
}
リモート管理しているファイルの場所を変更したい
本題に入ります。
今回はリモート管理しているファイルの保存先を
fuga/piyo -> fuga/piyo2
に変えたいです。
コードベースだと下記のようにして保存先を変更できます。
terraform {
  ...
  ...
  ...
  backend "gcs" {
    bucket = "hoge"
    prefix = "fuga/piyo2"
  }
}
上記のように変更してterraform initを実行すると新しい保存先に tfstate ファイルが保存さます。
再作成(create)されることなく、tfstate の保存先だけ変更
変更後の tfstate で apply しようとすると前の terraform 管理下から外れてしまうため再作成が行われます。
では、再作成を行うことなく tfstate の保存先の変更だけ行いたい場合はどうしたら良いのでしょうか。
結論以下が手順になります。
- 元のフォルダ(
fuga/piyo)の tfstate を指定し、terraform init - tfstate をローカルに保存
 backendに保存したい保存先(fuga/piyo2)を記載- ローカルに保存した tfstate をリモートのストレージに保存
 .terraform,terraform.lock.hclを削除し、terraform init
コードベースで書くと以下になります
terraform initterraform state pull > hogera.tfstate
terraform {
  ...
  ...
  ...
  backend "gcs" {
    bucket = "hoge"
    prefix = "fuga/piyo2"
  }
}
terraform state push hogera.tfstateterraform init
これで、再作成を行うことなく tfstate の保存先の変更だけできるようになりました。
まとめ
tfstate のフォルダ先だけ変更行う手順を紹介しました。
tfstate の管理は特に慎重に行わなければなりません。
terraform planで変更箇所もしっかりと確認するようにしましょう。
以上兄山でした。