Carpe Diem

備忘録。https://github.com/jun06t

Terraformで過去に作ったリソースを別ディレクトリに分けたい

概要

Terraformを使う上で、DBなどのデータ系のリソースはそうそう変更することはないので、オペミスなどを防ぐために別ディレクトリに分けておくと安心です。
しかし既に作ってしまっていた場合、*.tfとともにその部分のterraform.tfstateを移動しなくてはいけないですが、手動でterraform.tfstateをいじるのは非常に大変です。
そこで使えるのがstate mvというコマンドです。

環境

  • Terraform 0.10.2

使い方

作業手順

以下のフローで進めます。

  1. ディレクトリを用意する
  2. 移動したいリソースのコードを別ディレクトリにコピペ
  3. state mvtfstateを移動
  4. 古いディレクトリにあるコードを削除

ディレクトリ構成は以下のように変更する予定です。

移動前のディレクトリ構成

.
├── 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 mvtfstateを移動

state mvの基本的な使い方は以下です。SOURCEDESTINATION-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はインフラをコードで管理できる非常に良いツールですが、ディレクトリ構成をしっかり考えないと後で苦労することになります。
ツールのアップデートによってその時のベストプラクティスも変わっていくと思うので、それに合わせる際にこういったコマンドを利用すると少しは楽に対応できると思います。

ソース