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