terraform workspace で環境毎に tfsate 管理
terraform workspace で環境毎に tfsate 管理した話です。
追記 2019/04/17
追記時点で workspace は運用時点の問題が多くあった為、利用していません。以下記事ご参考いただければと思います。
概要
Terraform tfstate の管理をかつて
0.8 系では -backend-config でせっせと環境(stg,prod) 毎に bucket を変えて、
なんてコードを見てきました。
ですが、
workspace で 1 つの bucket に 環境毎に保管できる様になりました。
厳密には環境毎でなくとも
リソースの集合毎、module 毎等で管理するイメージですが
今回はイメージを捉えやすく環境毎で分けました。
歴史
- 0.5 で S3 で管理、
- < 0.9 では、 remote config で管理場所を設定
- = 0.9 では、terraform workspace で同一ディレクトリで複数のリソース群を管理 
とより利用しやすくなりました。
前提
以下条件とします。
- tfstate は backend.tf で s3 管理
移行手順
既存 terraform で tfstate 確認
- 想定の実行計画通りか確認します。
- 異なる場合は、そもそも現環境と差分が生じている、及び、tfstate が正しく取得できていない等、問題ありなのでそちらを修正します。
| 1 | $ terraform plan | 
tfstate ファイル取得
local に terraform.tfstate を取得します。
中身を確認してリソースの設定がある程度問題ないか確認しておきます。
- 0.8 系
| 1 | $ terraform remote config \ | 
- 0.9 系以降
| 1 | macOS%$ terraform state pull > terraform.tfstate | 
terraform 0.11.x (2017 年 12 月現在最新) へバージョンアップ
Homebrew ならば upgrade で!
| 1 | macOS%$ brew upgrade terraform | 
state 管理を backent.tf で記述
既にこの様に設定されている方はスキップです。特に普遍的な書き方です。
| 1 | terraform { | 
Workspace 作成
- Workspace stg作成
| 1 | $ terraform workspace new stg | 
- workspace リスト一覧
| 1 | $ terraform workspace list | 
tfstate を push
| 1 | $ terraform state push -force .terraform/terraform.tfstate | 
これで S3 tfstate.bucket の env:/stg/ ディレクトリ以下に terraform.tfstate が push されました。
実際に S3 を見て確認してみてください。

env でなく env: なのが肝です。
実行計画確認
| 1 | $ terraform plan | 
想定の実行計画通りか確認して問題なければ移行完了です。
おまけ
terraform を指定したバージョンで実行するには
one-off Container で実行できる様に Makefile でラップする、
が今の所自分の中のベストプラクティスです。
これによって local 環境に依存せず指定したバージョンの terraform 実行が可能となります。
one-off Container とは
one-off Container は Docker コンテナを run --rm で 1 度のコマンド実行の為だけに起動する手法です。
Makefile で Docker コマンドをラップしておくとTERRAFORM_VERSION を変更するだけで
指定の terraform バージョンを利用できます。
以下は 0.11.1 の例です。
| 1 | TERRAFORM_VERSION=0.11.1 | 
- make init ENV=stg実行で以下まとめてました- tfstate 初期化
- workspace stg作成
- 選択した workspace の tfstate で初期化
 
きっとさらに素敵なベストプラクティスがあれば教えてください!
参考になれば幸いです。
terraform workspace で環境毎に tfsate 管理
https://kenzo0107.github.io/2017/12/04/2017-12-05-terraform-workspace-tfsate/
