これは「初老丸の独り Advent calendar 2015」の六日目の記事です。

tl;dr

前の記事で久しぶりに Terraform 触っていて tfstate ファイルを terraform が扱えるリソース以外から再利用出来そうって思ったのでメモ。

メモ

参考

tfstate ファイルとは

  • Terraform で管理しているインフラの状態を JSON で保存しているファイル
  • デフォルトでは tf ファイルと同じディレクトリに terraform.tfstateterraform.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 RoleS3 bucket の値を利用してレジストリ登録用の JSON を作成している。

イメージとしては以下の通り。

20151206103734

ポイントとか

  • Terraform の Output Variables を定義しておくと再利用時の JSON 解析が楽になる
  • S3 とか Consul に tfstate ファイルを保存する場合でも同じようなことができると思う(読み込み方法を変えるだけ)

以上

ニーズってあるのかなって思いながら書いたメモでした。

元記事はこちら

(ショロカレ 6 日目)terraform.tfstate の情報を terraform が扱えるリソース以外から再利用するメモ