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から確認できます。
0.8以前を利用している場合はbackendを有効にしたtfstateファイルを用意する必要があります。次からは0.8.xまでのリソース状態を保持したまま新機能のbackendを有効にしたtfstateファイルへのマイグレーション手順についてまとめていきます。
マイグレーション手順
次の環境のマイグレーション手順になります。
0.8.8
から0.9.1
へのバージョンアップする- これまではremoteに
S3
をつかっていて、これからもS3
を利用する - ロールバックできるように、これまでのtfstateファイルは保持して新しいtfstateファイルを用意する
0.8.8
と0.9.1
のterraformを使うのでtfenvを使ってterraformを切り替えながらマイグレーションを行う
1:tfファイルにterraformセクションを追加してbackends を設定する
次のように設定しました。
|
|
- AWSの
access_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でインストールしたバージョンリスト
1 2 3 |
terraform/dev ➤ tfenv list 0.9.1 0.8.8 |
0.8.8を使いremote configする
1 2 3 4 5 6 |
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ファイルをマイグレーションする
1 2 3 4 5 6 7 |
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ファイル内のremote
がbackend
に置き換わります。 - 次の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にアップロードします。
1
|
terraform/dev ➤ aws s3 cp ./.terraform/terraform.tfstate s3://tfstate-bucket/dev0.9 |
こうすることで開発中のtfstateファイルに影響が及ぶことはなくマイグレーションのロールバックができる状態にします。
4:最後にplanを実行して新しいtfstateファイルにリソースの差分がないか確認する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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
- Terraform 0.9 | HashiCorp
- core: introduce "backends" to replace "remote state" (superset) and fix UX by mitchellh · Pull Request #11286 · hashicorp/terraform · GitHub
- Backends: Migrating From 0.8.x and Earlier - Terraform by HashiCorp
- Backends - Terraform by HashiCorp
- State: Locking - Terraform by HashiCorp