【 初心者向け 】Terraformで使える変数まとめてみた

# 概要
##### 今回は下記のUdemy動画講座を視聴しました。Terraformで使用できる変数について学習したのでそれらを自分なりに分かりやすくまとめてみたので、アウトプットとして記事に残しておきます。

https://www.udemy.com/share/104bRQ3@P1HaFLFjfCXJhWg_qJmCl25yUITQBXIyneNigJQryAp-Oyqq4lxa3eKVGy1fdOr0uA==/

# 講座について
#### こちらの講座は、AWSのリソース管理をTerraformを用いた方法で一から体系的に学べる講座になっています。
前半でTerraformの基本的な使用方法を解説し、後半ではAWS環境に実際にリソースを構築するハンズオンで構成されています。

:::note warn
### 前提条件
講座のハンズオンを実施する前提条件として、下記のような準備が必要になりました。
・PCへGitBashのインストール
・VS Codeのインストール
・AWSアカウントの登録
※ただ、これらの必要な準備も講座内で丁寧に解説してあるため身構える必要はありません。**実務でTerraformを扱う際の理解度の向上に役立ちました。**
:::

# 言語について
#### まず、Terraformで使用される言語は **HCL2** と呼ばれる言語です。
これはTerraformを提供するHashicorp社独自の言語になります。
下記のHashicorp社公式ページから言語について確認できますが、物量が多くて目当てのコードを探すのには時間がかかります。公式のドキュメントの読み方も動画講座内で解説していましたので、ぜひ参考にしてください。

https://www.terraform.io/

# 変数とは
#### 初めに、変数とは何かを再確認します。
変数とは、**文字列や数字を入れておく箱**とよく表現されます。
一つのファイルで`project-freddy`という名称が100回出てくるとして、
この`freddy`を`chica`変えたいなら、100カ所すべて変えなければなりませんよね。そうなるとあまりにも大変でミスも多そうです。

その場合、`freddy`の部分をあらかじめ適当な名前の変数の箱にしておくと、箱に何を入れるかを書き換えるだけですべての変更が終わりますし、また次に別の情報を入れる時もひと手間だけで済んで簡単です。

このように変更される可能性がある部分に中身を入れ替え可能な箱を設定することを変数といいます。

# Terraformで使える変数について
#### 今回学んだTerraformで使える変数についてまとめていきます。
## Locals
ファイルに限定して動作する変数となり、ファイル外やコマンドなどから再定義ができない特徴を持ちます。
```Terraform:main.tf（例）
locals  {
    project = "demo"    #変数名　＝　"値"
    env     = "env"     #変数名　＝　"値"
}
```
上の例では緑色の`project`と`env`が変数名となり、＝の後の`demo`と`env`が値になります。
このファイルで、locals以下に何度`project`が出てきても、＝の後の`demo`を変更するだけで一度に値を変更可能になるというわけですね。
## Variable
#### 別のファイルやコマンドから変数の中身（値）を変更可能で、基本的に変数を定義する際はこのコマンドを使用します。
:::note warn
Variableコマンドは種類が多いため分けて解説していきます。
:::
### プリミティブ
variableの最も基本的な形で、変数一つにつき一つのデータ型を指定して定義を行います。

```terraform:データ型：文字列
variable "project" {
    type        = string    #文字列を代入可能なデータ型
    default     = "demo"    
}
```
```terraform:データ型：数字
variable "project" {
    type        = number    #数字を代入可能なデータ型
    default     = 10
}
```
```terraform:データ型：真偽
variable "project" {
    type        = bool      #true,falseの真偽を代入可能なデータ型
    default     = true      #trueもしくはfalse
}
```
上の例で、`type`の後の記載がそれぞれ違うことが分かりますね。
これらはデータ型と呼ばれ、変数にどの形式の情報を入れることができるか定めています。

:::note 
### Geekポイント
**データ型**
数字を入れるべき変数に誤って文字列を設定してしまうことなどを防止します。
ファイルを変更するのが自分だけとは限らない現場では、必須の設定項目ですね。

**default**
variable変数はほかのファイルで変数の値を指定することを前提にしています。
そのため、指定されなかった変数がそのまま空で出力されないためにあらかじめデフォルトで出力される値を設定しておくことが一般的です。
:::
### object
キーバリュー型のデータ型の一つで、一つの変数の中に複数のキーを設定でき、キーのデータ型も指定することができます。
```terraform:main.tf
variable "project" {        
    type        = object({  
        name    = string        #キーのデータ型を指定
        age     = number        #キーのデータ型を指定
    })
    default     = {
        name    = "watanabe"    #キーの値を指定
        age     = "22"          #キーの値を指定
    }    
}
```
objectのいいところはキーに``数字``や``文字列``を指定できることです。
そのため、キーとバリューの組み合わせを自由度高く作成できます。

:::note warn
ちなみに、この変数をobjectを使用せずに書くとこうなります。
:::
```terraform:main.tf
variable "name" {
    type        = string
    default     = "watanabe"
}
variable "age" {
    type        = number
    default     = "22"
}
```
サーバなどの設定値が多いリソースにも一つのvariable変数で対応でき、変数ファイルの記述が簡潔でより見やすくなるため、多用されるデータ型の一つです。

### tuple
objectのように複数のデータ型と値を指定可能で、連続するデータのN番目のデータの型を指定できます。
```terraform:main.tf
variable "project" {
    type        = tuple([   
        string,number         #1番目は文字列、2番目は数字のデータ型を指定
    ])
    default     = ["watanabe",22]
}
```

### list
今度は連続するデータのデータ型を一括で指定可能なデータ型になります。
```terraform:main.tf
variable "project" {
    type        = list(string)         #すべて文字列として指定
    default     = ["watanabe","horimoto"]
}
```

### map
最後に、混同しやすい``map``ついてです。
まず、``object``と``map``は2つともキーバリュー型の変数でよく似ているため混同されがちです。
``map``の特徴は次の通りです。
**・キーは必ず文字列となる。**
**・バリュー（値）はすべて同じデータ型となる。**
```terraform:main.tf
variable "project" {
    type        = map(string)        #データ型を文字列に一括指定
    default     = {
        "High"  = "m5.2xlarge"
        "Mid"   = "m5.large"
        "Logh"  = "t2.micro"
    }
}
```

# 最後に
今回はTerraformで使用できるデータ型の代表的なものをまとめてみました。
個人的な学習の備忘録の点が強いので、見づらい部分があればコメントでご指摘いただけると幸いです。
本記事は以上で終わりですが、まだまだアウトプットしていくのでよろしくお願いします。