terraformで変数を扱う（コマンドライン引数、デフォルト値、tplファイル）

## 紹介する内容
- 変数の使い方
  - コマンドラインから引数を渡される場合
  - コマンドラインからtfvarsファイルを指定した場合
  - デフォルト値を設定する場合
  - tplファイルを活用する場合
     - tplファイルを`data "template_file"`やtemplatefile関数を活用します


## 結論
- コマンドラインから引数を渡される場合
  - 使用予定の変数が一つのみなら、これで十分かと思います
- コマンドラインからtfvarsファイルを指定した場合
  - tfvarsファイルにvariable宣言やvariableのデフォルト値が一緒に設定できなくて少し残念でした
     - tfvarsファイルにvariable宣言ができなくてvariable宣言のために別のファイルを作る必要があります
- デフォルト値を設定する場合
  - 事前に定義したい値(ipやリソース名統一など)をデフォルト値に宣言しておくと、便利でした
- tplファイルを活用する場合
  - AWSコンソール上で見たjsonファイルをそのままにして、必要な部分だけ変数で埋めることができて良かったと思います
  - 例えば、AWSのIAM policyやECSのtask definitionなどに使えます


## 紹介始めます
### ディレクトリ構成
全体ソースコードは https://github.com/cheekykorkind/qiita-example/tree/master/terraform/var-examples で確認できます

- 全体図
![allD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/569c484c-46c6-59b3-b49d-b46eab14675f.png)


- コマンドラインから引数を渡される場合ディレクトリ
- コマンドラインからtfvarsファイルを指定した場合
![commandlindParamD.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/33e79762-eb8e-d96d-1aa3-5e78e036e7d5.png)


- デフォルト値を設定する場合
![defaultVarsD.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/3bec7627-4d76-ad89-d7d8-a6dc33607b5d.png)


- tplファイルを活用する場合
![tplD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/ee1bc2b5-931d-62d5-9fff-2ffdc867e59c.png)



### tplファイルを活用する場合だけ追加説明
- 結果画面は続く次の項目`試し順番です`で確認できます
- 他の場合は説明なしでソースコード見たら理解が難しくないと思いまして省略します。
   - 全体ソースコード: https://github.com/cheekykorkind/qiita-example/tree/master/terraform/var-examples 

#### tplファイルを活用するコード
```
output "output-s3-policy-template" {
  value = templatefile("${path.root}/s3-policy-template.tpl", {
    my-value = "goodddddddddddddddddddddddddd"
  })
}

data "template_file" "ecs-task-definition" {
  template = "${file("${path.root}/ecs-task-definition.json.tpl")}"

  vars = {
    my-farmily-name = "yesssssssssssssssssssssssssssssssssssss"
  }
}

output "output-template-two" {
  value = data.template_file.ecs-task-definition.rendered
}
```
- `output "output-s3-policy-template"`部分
  - `templatefile(...)`はterraformが提供する関数です。用意したファイルのパスを第一引数、入れたい値を第二引数に入れて使用できます。第二の`my-value`の値はs3-policy-template.tplの${my-value}に代入されます。
     - https://www.terraform.io/docs/configuration/functions/templatefile.html
     - s3-policy-template.tplのコード

```
{
...
            "Resource": [
                "arn:aws:s3:::${my-value}",
                "arn:aws:s3:::${my-value}/*"
            ]
...
}
```



- `data "template_file" "ecs-task-definition"`部分
  - `data "template_file"`はterraformが提供する機能です。
    - template属性にtplのファイルをfile関数を使用してstringに変換して渡します。
       - https://www.terraform.io/docs/providers/template/d/file.html
       - https://www.terraform.io/docs/configuration/functions/file.html
    - vars属性の`my-farmily-name`の値はtplファイルで書いた変数部分(`${my-farmily-name}`)に代入されます
       - ecs-task-definition.json.tplのコード

```
{
    "family": "${my-farmily-name}",
    省略
    ...
}
```



### 試し順番です
terraformのoutputを使用して、変数をコンソールに出力します。(=リソース作ってません)

1. docker composeがあるデレクトリー移動に移動します 
  - `cd qitta-example/terraform/var-examples`
2. dockerコンテナをバックグラウンドで起動します
  - `DOCKER_UID=$(id -u $USER) DOCKER_GID=$(id -g $USER) docker-compose up -d`
3. dockerコンテナに入ります
  - `docker exec -it var-examples /bin/sh`

4. 試したい例があるterraformデレクトリーに移動します
  - コマンドラインから引数を渡される場合
     - `cd ~/terraform/examples/command-line`
     - `terraform init`
     - `terraform apply -var="lambda-zip-path=my-zip-path"`
![commandlindParam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/091ab2a5-5100-bb1c-17f8-d2f6ab14d4ff.png)


  - コマンドラインからtfvarsファイルを指定した場合
     - `cd ~/terraform/examples/command-line`
     - `terraform init`
     - `terraform apply -var-file="tfvars-exam.tfvars"`
![commandlindTfvars.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/7071c425-3513-9df9-377e-a1e15d40d9b9.png)


  - デフォルト値を設定する場合
     - `cd ~/terraform/examples/set-default`
     - `terraform init`
     - `terraform apply`
![defaultVars.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/95ccfe3c-33e5-300e-5bf2-ebe8a06d1224.png)


  - tplファイルを活用する場合
     - `cd ~/terraform/examples/tpl`
     - `terraform init`
     - `terraform apply`
![tpl.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247584/240ddd54-52e2-ce8c-5d85-5eb8b93237f1.gif)