Terraform Backend Config の path を prefix に移行する

Posted on 2021-04-19 in zakki

GCP のリソース作成を Terraform で実施する際、Terraform の構成を管理する state ファイルは remote state として GCS に格納し管理することが可能です。その場合、tf ファイルは以下のように記載することになります。

  • backend.tf
terraform {
  backend "gcs" {
    bucket      = "terraform-bucket"
    path        = "terraform/terraform.tfstate"
    credentials = "./credentials.json"
  }
}

remote state は/terraform-bucket/terraform/terraform.tfstateとして格納されています。

数日前に Terraformv0.15.0がリリースされました。v0.15.0では上の記載のpathが廃止となり、prefixでの表記が必要になりました。

prefixは以前から使用可能となっているため、既に使用していれば特に問題はないのですが、pathのままv0.15.0を迎えてしまいそうな環境があったため、移行方法の確認をしました。

移行方法

基本方針は、state ファイルをリネームしてterraform initを行うというものです。

  • (state ファイルのバックアップを取得する )
  • terraform workspace listを実行して、現在使用しているワークスペース名を確認する。
  • state ファイルのリネームを行う。
  • backend.tfの記載を修正する。
  • (.terraformディレクトリを削除する )
  • terraform initを行う

State ファイルのバックアップ ( オプション )

GCS に格納・管理している state ファイルをローカルにバックアップします。

terraform workspace listを実行する

prefixで state ファイルの名前を指定は ( おそらく ) 出来ず、workspace の名前によると記載されています。

prefix - (Optional) GCS prefix inside the bucket. Named states for workspaces are stored in an object called <prefix>/<name>.tfstate.

そのため、terraform workspace listで現環境の確認を行います。

$ terraform workspace list
* default

workspace はdefaultとなっていることが分かりました。そのため移行後はdefault.tfstateとして保存することになります。

State ファイルのリネームを行う

GCP のコンソール等から state ファイルのリネーム (default.tfstate) を行います。

backend.tfの記載を修正する

以下のように修正します。

terraform {
  backend "gcs" {
    bucket      = "terraform-bucket"
    prefix      = "terraform"
    credentials = "./credentials.json"
  }
}

この場合は/terraform-bucket/terraform/default.tfstateとして格納・管理することになります。

.terraformディレクトリを削除する ( オプション )

terraform initの前に.terraformディレクトリを削除します。( 未削除でもinitにて再構成されましたが念のため。)

terraform initを行う

terraform initを行い、backend 構成情報を初期化します。

$ terraform init

Initializing the backend...

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

Initializing provider plugins...
- Reusing previous version of hashicorp/google from the dependency lock file
- Installing hashicorp/google v3.64.0...
- Installed hashicorp/google v3.64.0 (signed by HashiCorp)

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

確認

terraform planを行い、差分有無を確認します。

$ terraform plan
( 略 )

No changes. Infrastructure is up-to-date.

This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, no
actions need to be performed.

問題なさそうでした。

GCP Terraform