インフラ維新 ハシモトプロダクト Terraform の設定ファイル

## <i class="fa fa-moon-o" style="font-size:1em;"></i>　概要
インフラ維新 ハシモトプロダクト Terraform の設定ファイルについて

## <i class="fa fa-question-circle" style="font-size:1em;"></i> Terraform について
Terraform については下記記事を参照

* <i class="fa fa-external-link-square" style="font-size:1em;"></i> [ハシモトさんの頭に広がる宇宙 Terraform とは？](http://qiita.com/tbpgr/items/a0a31c433f65e58368c6)

## <i class="fa fa-user" style="font-size:1em;"></i><i class="fa fa-desktop" style="font-size:1em;"></i> 設定ファイルの特徴
Terraform は Terraform フォーマットと JSON フォーマットの両方をサポートしている。
ただし、公式では Terraform フォーマットの利用を推奨しています。

Terraform フォーマットは、人間の可読性とプログラムによる処理のしやすさの両面を備えています。

## Terraform Syntax
### サンプル設定
~~~
# single line comnent
/*
multi line comment1
multi line comment2
*/
variable "heroku_email" {}
variable "heroku_api_key" {}

provider "heroku" {
  email = "${var.heroku_email}"
  api_key = "${var.heroku_api_key}"
}

resource "heroku_app" "web" {
  name = "ruboty-gacha"
  region = "us"
  stack = "cedar-14"
  config_vars {
    BUILDPACK_URL="https://github.com/tbpgr/ruboty-gacha.git"
  }
}
~~~

### <i class="fa fa-comment" style="font-size:1em;"></i> 1行 コメント
`#` で開始。 Ruby などと同じ。

#### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
~~~
# single line comnent
~~~

### <i class="fa fa-comments" style="font-size:1em;"></i> 複数行 コメント
`/*` から `*/` までがコメント。 Java などと同じ。

複数行コメントで、 `/* ... */` を採用しているプログラム言語の場合、
大抵単一行コメントは `//` である。（私が知らない例があるかもしれない）
`#` と `/* ... */` の組み合わせは珍しく **ちょっと違和感** があります。

#### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
~~~
/*
multi line comment1
multi line comment2
*/
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> 値の設定
`key = value` で設定を行う。

#### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
~~~
name = "ruboty-gacha"
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> String はダブルクォーテーションで囲む
#### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
~~~
name = "ruboty-gacha"
~~~

### <i class="fa fa-gear" style="font-size:1em;"></i> String の変数展開
`${}` 記法( [Interpolation Syntax](https://www.terraform.io/docs/configuration/interpolation.html) )により、
変数や他のリソースの値などを埋め込むことができます。


#### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
~~~
name = "${var.app_name}"
~~~


### <i class="fa fa-sort-numeric-asc" style="font-size:1em;"></i> 数値
数値は基本 10 進数で設定する。
`0x` 記法で記述すれば、 16 進数になる。

#### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
~~~
count = 16
~~~

~~~
count = 0x10
~~~

### <i class="fa fa-sort-numeric-asc" style="font-size:1em;"></i> 数値 + 単位
10 進数 + `kKmMgG` のどれかで、各単位の数値を表すことができます。

#### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
~~~
# 1000
count = 1k
~~~

### <i class="fa fa-sort-numeric-asc" style="font-size:1em;"></i> 数値 + 単位( 2の冪 )
10 進数 + `[kKmMgG]b` で、各単位の2の冪の数値を表すことができます。

#### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
~~~
# 1024
count = 1kb
~~~

### <i class="fa fa-flag" style="font-size:1em;"></i> 真偽値
真偽値は `true` と `false` で表します。

#### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
~~~
hoge = true
hige = false
~~~

### <i class="fa fa-list" style="font-size:1em;"></i> 配列
プリミティブな型の配列は `[]` で囲みます。

#### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
~~~
["hoge", 2, "hige"]
~~~

### <i class="fa fa-arrows-h" style="font-size:1em;"></i> ハッシュ
ハッシュは `{}` 記法です。

#### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
~~~
{ "key1": "value1", "key2": "value2" }
~~~

### <i class="fa fa-sitemap" style="font-size:1em;"></i> 階層
リソースや変数はハッシュに似た記法で記述できます。
配列 + ハッシュの記法に置き換えることも可能ですが、
階層記法のほうが読みやすいでしょう。

#### <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
* 階層記法

~~~
provider "heroku" {
  email = "${var.heroku_email}"
  api_key = "${var.heroku_api_key}"
}
~~~

* 上記の階層記法は、以下の 配列＋ハッシュ記法と等価

~~~
provider = [{
  "heroku": {
    "email": "${var.heroku_email}",
    "api_key": "${var.heroku_api_key}"
  }
}]
~~~

## <i class="fa fa-warning" style="font-size:1em;"></i> その他
その他のより詳しい情報については、公式サイトのドキュメントをご確認ください。

* <i class="fa fa-external-link" style="font-size:1em;"></i> [Configuration - Docs - Terraform](https://www.terraform.io/docs/configuration/index.html)