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.tf
に terraform
ブロックがあると、もとの設定の 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
を削除して完了です。