Terraform Cloud から S3 に tfstate を移行する

Posted on

Terraform Cloud への移行手順は公式ドキュメントの "Migrate State to Terraform Cloud" でも丁寧に解説されていますが、Terraform Cloud から別の backend に移行する手順は公式には用意されていません。

たとえば、Terraform Cloud から S3 に tfstate を移行しようとすると、まだ実装されていないというエラーが表示されます。

$ terraform init

Initializing the backend...
Migrating from Terraform Cloud to backend "s3".
╷
│ Error: Migrating state from Terraform Cloud to another backend is not yet implemented.
│ 
│ Please use the API to do this: https://www.terraform.io/docs/cloud/api/state-versions.html
│ 
│ 
╵

とはいえ、tfstate さえコピーすれば移行できると思うので試してみました。

今回検証で使ったのは Terraform v1.4.6 (linux_arm64) です。

tfstate の移行手順

まず、Terraform Cloud にある tfstate を pull します。念のためバックアップも取っておきます。

$ terraform state pull > terraform.tfstate

$ cp terraform.tfstate terraform.tfstate.backup

次に override.tf を作成して backend を local に変更します。 override.tfterraform ブロックがあると、もとの設定の cloud もしくは backend を常に上書きしてくれます。

$ cat << EOF > override.tf
terraform {
  backend "local" {
    path = "terraform.tfstate"
  }
}
EOF

backend を変更したので init し直します。 -reconfigure を付けることで pull してきた tfstate を変更せずにそのまま使います。

$ terraform init -reconfigure

Initializing the backend...

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

Initializing provider plugins...
(snip)

Terraform has been successfully initialized!

続いて backend を local から s3 に変更します。先ほど作成した override.tf をさらに書き換えます。

$ cat << EOF > override.tf
terraform {
  backend "s3" {
    bucket = "mybucket"
    key    = "path/to/my/key"
    region = "ap-northeast-1"
  }
}
EOF

backend を変更したので再度 init し直します。次は -migrate-state を付けて tfstate を S3 にコピーします。

$ terraform init -migrate-state

Initializing the backend...
Terraform detected that the backend type changed from "local" to "s3".

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 "s3" backend. No existing state was found in the newly
  configured "s3" backend. Do you want to copy this state to the new "s3"
  backend? Enter "yes" to copy and "no" to start with an empty state.

  Enter a value: yes


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

Initializing provider plugins...
(snip)

Terraform has been successfully initialized!

ここで plan を実行して "No changes." になることを確認します。

問題なければ override.tf に書いた一時的な backend と provider.tf などにあるもとの設定をマージします。あとは最初に pull してきた terraform.tfstate を削除して完了です。

Popular Entries

Recent Entries