概要
Terraformを使う上で、DBなどのデータ系のリソースはそうそう変更することはないので、オペミスなどを防ぐために別ディレクトリに分けておくと安心です。
しかし既に作ってしまっていた場合、*.tf
とともにその部分のterraform.tfstate
を移動しなくてはいけないですが、手動でterraform.tfstate
をいじるのは非常に大変です。
そこで使えるのがstate mv
というコマンドです。
環境
- Terraform 0.10.2
使い方
作業手順
以下のフローで進めます。
ディレクトリ構成は以下のように変更する予定です。
移動前のディレクトリ構成
. ├── config.tf ├── elb.tf ├── api.tf ├── database.tf ├── security_group.tf ├── terraform.tfstate ├── terraform.tfvars └── vpc.tf
移動後のディレクトリ構成
. ├── config.tf ├── elb.tf ├── api.tf ├── database │ ├── database.tf │ └── terraform.tfstate ├── security_group.tf ├── terraform.tfstate ├── terraform.tfvars └── vpc.tf
このように子ディレクトリに分ければdatabase.tf
が管理から外れるので、仮に親ディレクトリで間違ったコマンドを実行しても影響はありません。
実際に移動していく
1. 別ディレクトリを用意する
database
ディレクトリを用意します。
$ mkdir database
2. 移動したいリソースのコードを別ディレクトリにコピペ
$ cp database.tf database/
3. state mv
でtfstate
を移動
state mv
の基本的な使い方は以下です。SOURCE
やDESTINATION
は-target
などで指定するようなリソース名です。
$ terraform state mv [options] SOURCE DESTINATION
今回tfstate
を移動するので、-state-out=path
というオプションを利用します。
具体的なコマンドは以下のようになります。各リソースを一つずつmv
していきます。
$ terraform state mv -state-out=database/terraform.tfstate \ aws_instance.mysql aws_instance.mysql Moved aws_instance.mysql to aws_instance.mysql
4. 古いディレクトリにあるコードを削除
移動が完了したら古いコードを削除します。
$ rm database.tf
まとめ
Terraformはインフラをコードで管理できる非常に良いツールですが、ディレクトリ構成をしっかり考えないと後で苦労することになります。
ツールのアップデートによってその時のベストプラクティスも変わっていくと思うので、それに合わせる際にこういったコマンドを利用すると少しは楽に対応できると思います。