これは「初老丸の独り Advent calendar 2015」の六日目の記事です。
tl;dr
前の記事で久しぶりに Terraform 触っていて tfstate ファイルを terraform が扱えるリソース以外から再利用出来そうって思ったのでメモ。
メモ
参考
tfstate ファイルとは
- Terraform で管理しているインフラの状態を JSON で保存しているファイル
- デフォルトでは tf ファイルと同じディレクトリに
terraform.tfstate
とterraform.tfstate.backup
というファイル名で保存されている - ローカル以外に Amazon S3 や Consul 等(HTTP の事例は見たことないけど)に保存することも出来る
terraform 内でリソース情報を使い回す例
例えば、以下のように…
# # Create IAM Role # resource "aws_iam_role" "oreno_es_role" { name = "oreno_es_role" assume_role_policy = <IAM ロールに IAM ロールポリシーをアタッチする際に IAM ロールの ID(
role ="${aws_iam_role.oreno_es_role.id}"
)を定義している。(これは普通にやるパターン)terraform 以外で再利用する例
Terraform で作った IAM ロールや S3 バケット名を利用して Amazon Elasticsearch Service のスナップショットレジストリを登録する例。
(snip) # # terraform.tfstate を読み込む # def read_tfstate json_data = open('/tmp/terraform/terraform.tfstate') do |io| JSON.load(io) end output = json_data['modules'][0]['outputs'] return output end # # outputs キーから必要なキーと値をパースして再利用 # def regist_snapshot_dir state = read_tfstate template = <
terraform.tfstate
から JSON を解析してoutputs
キーのIAM Role
とS3 bucket
の値を利用してレジストリ登録用の JSON を作成している。イメージとしては以下の通り。
ポイントとか
- Terraform の Output Variables を定義しておくと再利用時の JSON 解析が楽になる
- S3 とか Consul に tfstate ファイルを保存する場合でも同じようなことができると思う(読み込み方法を変えるだけ)
以上
ニーズってあるのかなって思いながら書いたメモでした。
元記事はこちら
「(ショロカレ 6 日目)terraform.tfstate の情報を terraform が扱えるリソース以外から再利用するメモ」