ようへいの日々精進XP

よかろうもん

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

これは「初老丸の独り 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 = <<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 RoleS3 bucket の値を利用してレジストリ登録用の JSON を作成している。

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

f:id:inokara:20151206103734p:plain

ポイントとか

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

以上

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