TL;DR
Terraform 0.10から、Workspacesという機能が追加されました。
https://www.terraform.io/docs/state/workspaces.html
0.9で追加された State: Environmentsが名称変更されたものです。
1つのディレクトリで、任意の複数の環境(e.g dev, stg, prod)を切り替えられるようにするものです。
下記を適用する下準備として、既存のtfディレクトリをWorkspaces管理に移行する際にはまったことのメモです。
Terraform Best Practices in 2017
既存のtfディレクトリをWorkspaces管理に移行する。
1. 既存のstateファイルからworkspaceを作る(とincompatible state lineageエラーが出る)
terraform workspace new -state=./terraform.tfstate [workspace名]
$ terraform workspace new -state=terraform.tfstate example
Created and switched to workspace "example"!
You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.
incompatible state lineage; given 3d2aa9e3-198b-400c-a1aa-0a8e15ac44b4 but want 768adb25-938d-45cc-9195-fae815470dd3
$
詳細は確認していませんが、newした時点で作成されるtfstateファイルにはlineageが発行されているのですが、
-stateで指定した既存のtfstateで上書きする際に、既存のtfstateファイルでまるごと上書きしてしまい、lineageが一致しなくなることが問題のようです。
2. stateファイルをs3などのremoteで管理している場合は、stateファイルをremoteとsyncした上で手動マージする
remoteの最新stateファイルをpullし、workspace:example用のtfstateファイルを置き換える
terraform state pull > ./terraform.tfstate.d/example/terraform.tfstate
"modules"を既存のもので差し替え、pushする
terraform state push ./terraform.tfstate.d/example/terraform.tfstate
3. 既存のtfstateファイルを引き継げているかをplanの結果を見て確認する
terraform plan -var-file=./tfvars/example.tfvars -out=path_to_plan.plan
問題なく移行できていれば、planの実行結果に新規作成されるリソースは存在しないはず。