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

GCPのリソース作成をTerraformで実施する際、Terraformの構成を管理するstateファイルはremote stateとしてGCSに格納し管理することが可能です。その場合、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ファイルのバックアップ(オプション)

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.

問題なさそうでした。

© てっくらのーと/mkr-note 2024