これは「初老丸の独り 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 = <<EOF (snip) } # # Create IAM Role Policy # resource "aws_iam_role_policy" "oreno_es_policy" { name = "oreno_es_policy" role = "${aws_iam_role.oreno_es_role.id}" policy = <<EOF { (snip)
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 = <<EOS { "settings": { "role_arn": "#{state['IAM Role']}", "region": "ap-northeast-1", "bucket": "#{state['S3 bucket']}" }, "type": "s3" } EOS uri = "https://" + ENV["ES_HOST"] + "/_snapshot/" + ENV["ES_SNAPSHOT"] res = post_request(uri, template) http_output(res) end (snip)
terraform.tfstate
から JSON を解析して outputs
キーの IAM Role
と S3 bucket
の値を利用してレジストリ登録用の JSON を作成している。
イメージとしては以下の通り。
ポイントとか
- Terraform の Output Variables を定義しておくと再利用時の JSON 解析が楽になる
- S3 とか Consul に tfstate ファイルを保存する場合でも同じようなことができると思う(読み込み方法を変えるだけ)
以上
ニーズってあるのかなって思いながら書いたメモでした。