tfstateファイルの保存先を変更する際に行ったこと

  • #開発
  • #Terraform"
  • #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 の保存先の変更だけ行いたい場合はどうしたら良いのでしょうか。

結論以下が手順になります。

  1. 元のフォルダ(fuga/piyo)の tfstate を指定し、terraform init
  2. tfstate をローカルに保存
  3. backendに保存したい保存先(fuga/piyo2)を記載
  4. ローカルに保存した tfstate をリモートのストレージに保存
  5. .terraform, terraform.lock.hclを削除し、terraform init

コードベースで書くと以下になります

  1. terraform init
  2. terraform state pull > hogera.tfstate
terraform {
  ...
  ...
  ...
  backend "gcs" {
    bucket = "hoge"
    prefix = "fuga/piyo2"
  }
}
  1. terraform state push hogera.tfstate
  2. terraform init

これで、再作成を行うことなく tfstate の保存先の変更だけできるようになりました。

まとめ

tfstate のフォルダ先だけ変更行う手順を紹介しました。 tfstate の管理は特に慎重に行わなければなりません。 terraform planで変更箇所もしっかりと確認するようにしましょう。 以上兄山でした。