理系学生日記

おまえはいつまで学生気分なのか

Terraform 0.13 系にあげるときの `Failed to decode current backend config`

Terraform 0.12 系から重い腰をあげて 0.13 系にあげる作業を進めていましたが、いくつかエラーが発生したので、その対応の顛末について。

terraform の version constraint でエラーになる

0.13upgrade コマンドを実行すれば良いんやろと雑に考えて、Batch update を以下のように実行するとエラーです。

$ find . -name '*.tf' | xargs -n1 dirname | uniq | xargs -n1 terraform 0.13upgrade -yes
Error: Unsupported Terraform Core version on tests/aws/kohari/runtimes/development/cacheable_frontend/main.tf line 2, in terraform:
   2:   required_version = "0.12.29"
This configuration does not support Terraform version 0.13.3. To proceed, 
either choose another supported Terraform version or update this version 
constraint. Version constraints are normally set for good reason, so updating 
the constraint may lead to other errors or unexpected behavior.

これを実行したのは terraform の 0.13.3 だったのですが、そもそも 0.12.29 を要求しているので 0.13upgrade コマンドすら実行できない模様です。このため、まずは tfupdate を使って一気に version constraint を 0.13.3 にあげました。

$ cd $(git rev-parse --show-toplevel)
$ tfupdate terraform -r -v 0.13.3 .

terraform initFailed to decode current backend config エラー

0.13upgrade コマンドを実行後、terraform init を実行するとエラーになります。

$ terraform init
Initializing modules...

Initializing the backend...

Error: Failed to decode current backend config

The backend configuration created by the most recent run of "terraform init"
could not be decoded: unsupported attribute "lock_table". The configuration
may have been initialized by an earlier version that used an incompatible
configuration structure. Run "terraform init -reconfigure" to force
re-initialization of the backend.

lock_table 等、既にサポートされていないキーが .terraform/terraform.tfstate に残っていることが原因のようです。以下のように、サポートされなくなった key-value を削除して terraform init を再実行しましょう。

--- terraform.tfstate.orig      2020-09-22 08:19:52.000000000 +0900
+++ terraform.tfstate   2020-09-22 08:29:44.000000000 +0900
@@ -18,7 +18,6 @@
             "iam_endpoint": null,
             "key": "ses/terraform.tfstate",
             "kms_key_id": null,
-            "lock_table": null,
             "max_retries": null,
             "profile": null,
             "region": null,
@@ -27,10 +26,8 @@
             "session_name": null,
             "shared_credentials_file": null,
             "skip_credentials_validation": null,
-            "skip_get_ec2_platforms": null,
             "skip_metadata_api_check": null,
             "skip_region_validation": null,
-            "skip_requesting_account_id": null,
             "sse_customer_key": null,
             "sts_endpoint": null,
             "token": null,

これで terraform init が成功するようになります。