helloworlds

not a noun, it's a verb

【terraform】"Error: Failed to load state" を解決する?!

今回は、Terraformについてです。

わたしがちょっとしたことでハマってしまったエラーについて、簡単ではありますが、メモがてら残したいと思います。

タイトルに"?!"と書いたのは、決定的な解決策?というか、 そもそも私のTerraformに関しての知見が足りないことでハマってしまったと思うので、ご了承ください。。。

また、完全な対応策というよりは、一時的な対応策になるので、そこもご了承ください。

(※完全にTerraformのstateファイルの挙動を理解していないので、わかり次第更新or新規で記事を投稿します!)

では、さっそく。

まえおき

Terraformでコマンドを叩いていたときのこと。

terraform planterraform applyなどなど

そしたらいきなり以下のエラーメッセージが表示されて、コマンドが叩けなくなってしまった。

Error: Failed to load state: Terraform 0.12.20 does not support state version 4, please update.

エラー内容的に、

Terraformのヴァージョン0.12.20は、stateファイル(.tfstate)のヴァージョン4をサポートしていません。アップデートしてください。

まあ、そのままなんだが、Terraformのヴァージョン0.12.20は、当時tfenvの最新ヴァージョンで、

前回実行したときのstateファイルにも、以下が記述され問題なさそう。

{
  "version": 4,
  "terraform_version": "0.12.20",
  "serial": 11,
.... 以下略 .... 

 調査

tfstateファイルは、手動で変更するのは推奨されてはいないので、手を加えたくありません。

同様に、ファイルを他のディレクトリにも移動させたくはありませんでした。

ググってみたところ、これしか近しいのが見つからず。。

github.com

と、ここで思ったこと。

思い当たる節

ちょっとした検証だったので、stateファイルはローカルで管理していました。

その際、.tfstateファイルをデフォルトの階層ではなく(terraform applyした階層)、.terraformに出力するようにしていました。

terraform {
  backend "local" { path = ".terraform/terraform.tfstate" }
}

.terraformディレクトリは、自動的に作成されるディレクトリなので、なーーんか怪しいかんじがしました。

一時的に対応

先に結論!

.tfstateファイルを移動させ、新たにterraform initする。

.terraformディレクトリから、違うディレクトリにstateファイルを移動させます。

この時、新たにディレクトリ作成してもいいし、backendで指定していたところを削除して、デフォルト状態にしてもいいと思います。

次に、コマンドterraform plan / applyをすると、以下のメッセージが表示されると思います。

Backend reinitialization required. Please run "terraform init".
Reason: Initial configuration of the requested backend "local"

The "backend" is the interface that Terraform uses to store state,
perform operations, etc. If this message is showing up, it means that the
Terraform configuration you're using is using a custom configuration for
the Terraform backend.

Changes to backend configurations require reinitialization. This allows
Terraform to setup the new configuration, copy existing state, etc. This is
only done during "terraform init". Please run that command now then try again.

If the change reason above is incorrect, please verify your configuration
hasn't changed and try again. At this point, no changes to your existing
configuration or state have been made.

Error: Initialization required. Please see the error message above.

tfstateファイルが意図したディレクトリにないので、バックエンドの初期化が必要とのこと。

なので、terraform initしましょうって書いてあります。

initする前に、前回applyを実行したときに反映したリソースを考慮します。

理由は、initコマンドを叩くとわかるのですが、以下を問われるかと思います。

$ terraform init

Initializing modules...

Initializing the backend...
Do you want to copy existing state to the new backend?
  Pre-existing state was found while migrating the previous "local" backend to the
  newly configured "local" backend. No existing state was found in the newly
  configured "local" backend. Do you want to copy this state to the new "local"
  backend? Enter "yes" to copy and "no" to start with an empty state.

  Enter a value: no

Successfully configured the backend "local"! Terraform will automatically
use this backend unless the backend configuration changes.

Initializing provider plugins...

Terraform has been successfully initialized!

簡単に訳すと、

設定された新しい"ローカル"バックエンドがあります。 新しく構成された"ローカル"バックエンドに既存の状態が見つかりませんでした。 コピーするには"yes"、空の状態で開始するには"no"を入力。

新しくstateファイルを管理するにあたって、"no"を選択する場合、

(おそらく)前回まで反映したリソースが反映してなかったことになります。

わたしの場合、そこまで重くないリソースを反映していたので、"no"を選択し完全に新規で管理することにしました。

terraform init実行!

イニシャライズ完了すれば一旦オーケーです。

ちょっと気になったこと

stateファイルに関しては、色んな記事で見かけますが、planファイルなるものが存在することも頭の片隅に入れておくべきかと思いました。

  • stateファイル -> terraformのリソースを管理
  • planファイル -> stateファイルを管理

planファイルは、terraform apply実行時に行われる一連の変更の説明や、stateファイルの配置場所を設定しているファイルになるのかと思います。

上記で説明したエラーに関連して、planファイルは.terraform/ディレクトリに自動生成されるようです。

もし、stateファイルをそのディレクトリに出力するようにしていると、ファイル名がおなじならどっちのファイルがどっちのファイルかわからなくなっていた、というわけです。

まとめ

まとめるほど、完全に理解できていないのですが、、、

一旦、.terraformディレクトリにはstateファイルを出力しないようにすることにしました。

ヴァージョン0.12系の記事も思ったよりなかったので、あまり下手なことはせずに管理するのもありかと思います。

もう少しアップデートが進んで、公式ドキュメントも充実してきたら色々とローカルでの管理方法を試してみようと思います。

それまでは、S3で管理したりするのがベターかな。

また、まとめなのに1つ疑問が。。。

私は新たにディレクトリを作成し、backendで指定し管理したのですが、コマンドを(plan)を叩くと成功はするですが、

新しく作成したディレクトリと、なぜか.terraformディレクトリと2つのstateファイルが作成されました。。。

なんなんだこれ。。。

(stateファイルとplanファイルがあると書かれている英語の記事を見つけました。。)

これは後ほど調査してみたいと思います。

あんまりまとまっていない内容でしたが、

以上.