Terraform 0.9がリリース。0.8.xから0.9.xのStateマイグレーション手順をまとめました。

HashiCorpからTerraform 0.9がリリースされました。「よし、最新バージョンにあげよう。」と作業をはじめましたがremoteコマンドが使えない。どうやら0.9からはremoteコマンドが廃止されたようです。このエントリではTerraform 0.9にバージョンアップをして0.8以前のterraform stateをマイグレーションする方法をまとめます。

remoteコマンドの廃止

remoteコマンドが廃止になりました。代わりにbackendsを利用してS3などのremoteにあるtfstateファイルの管理を行います。

remote stateがbackendsに置き換わる過程は次のPull Requestから確認できます。 github.com

0.8以前を利用している場合はbackendを有効にしたtfstateファイルを用意する必要があります。次からは0.8.xまでのリソース状態を保持したまま新機能のbackendを有効にしたtfstateファイルへのマイグレーション手順についてまとめていきます。

マイグレーション手順

次の環境のマイグレーション手順になります。

  • 0.8.8から0.9.1へのバージョンアップする
  • これまではremoteにS3をつかっていて、これからもS3を利用する
  • ロールバックできるように、これまでのtfstateファイルは保持して新しいtfstateファイルを用意する
  • 0.8.80.9.1のterraformを使うのでtfenvを使ってterraformを切り替えながらマイグレーションを行う

1:tfファイルにterraformセクションを追加してbackends を設定する

次のように設定しました。

terraform {
  backend "s3" {
    bucket = "tfstate-bucket" // 自身のbucket名を設定します
  }
}
  • AWSaccess_key, secret_key, regionはそれぞれ環境変数AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGIONを設定しているため省略しています。
  • S3のkeyは必須ですが省略しています。後述するinitコマンドの-backend-config オプションで開発環境や本番環境ごとにS3のkeyを分けているためterraformセクションでは省略します。

※ その他bucketなどのS3の変数はこちらにまとまっています。

2:0.8.8のterraformをつかいremote configをしてtfstateファイルをローカルに同期する

tfenvでインストールしたバージョンリスト

terraform/dev ➤ tfenv list
0.9.1
0.8.8

0.8.8を使いremote configする

terraform/dev ➤ tfenv use 0.8.8
Terraform v0.8.8

terraform/dev ➤ terraform remote config -backend=S3 -backend-config="bucket=tfstate-bucket" -backend-config="key=dev"
Initialized blank state with remote state enabled!
Remote state configured and pulled.
  • S3のkeyは開発環境のdevとしています

3:0.9.1のterraformをつかいinitをしてtfstateファイルをマイグレーションする

terraform/dev ➤ tfenv use 0.9.1
Terraform v0.9.1

terraform/dev ➤ terraform init -backend-config "key=dev"
Initializing the backend...
New backend configuration detected with legacy remote state!
・・・省略・・・
  • 最初のaskでremote stateから変更するか?と聞かれるので yesを入力します。これをすることでtfstateファイル内のremotebackendに置き換わります。
  • 次のaskでremoteのstateをローカルのstateにコピーする?と聞かれるのでローカルのstateを保持したければnoを入力、コピーするのであればyesを入力します。すでにローカルにstateがあるのでnoと入力。

4:マイグレーションしたtfstateファイルをS3にアップロードする

マイグレーション後に0.8.8にロールバックするかもしれないので、0.8.8で運用したtfstateファイルを残したいです。そのため新しいS3のkeyをdev0.9と決めマイグレーションしたtfstateファイルをS3にアップロードします。

terraform/dev ➤ aws s3 cp ./.terraform/terraform.tfstate s3://tfstate-bucket/dev0.9

こうすることで開発中のtfstateファイルに影響が及ぶことはなくマイグレーションロールバックができる状態にします。

4:最後にplanを実行して新しいtfstateファイルにリソースの差分がないか確認する

terraform/dev ➤ rm -rf ./.terraform

terraform/dev ➤ tfenv use 0.9.1
Terraform v0.9.1

terraform/dev ➤ terraform init -backend-config "key=dev0.9"
Initializing the backend...
・・・省略・・・

terraform/dev ➤ terraform plan --refresh=false
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, Terraform
doesn't need to do anything.
  • 0.9.1からはremote configを使わずinitを使いtfstateファイルをローカルに同期します

まとめ

  • 0.9.1へtfstateファイルのマイグレーション手順をまとめました。
  • 0.8.xまではremote configを利用していましたが、0.9.1からはinitを利用します。
  • backendではtfstateのリソース情報がメモリ上に管理されます。0.8.xまではリソース状態がtfstateファイルを開けば確認できましたがbackendでは確認できません。リソース状態の管理がセキュアになりました。
  • backendはSTATE LOCKINGを機能が有効になります。複数人でapplyを実行した場合にstateをロックし競合を防ぎます。CIなどでapplyが同時に稼働しても安心です。
  • もし0.7.xからのマイグレーションの場合はリソース状態に差分が生まれているのでリソース状態を0.8系に合わせる必要があります。

参考URL