terraformでインターネットゲートウェイ, ルートテーブルを作る

# 前回までのあらすじ
terraformでVPC, サブネットを作成する
https://qiita.com/sasshi_i/items/f4f65e18923d856be256

# 環境
- macOS Mojave 10.14.5
- MacBook Pro, 13-inch, Early 2015
- terraform v0.12.0
- direnv 2.20.1

# 目標成果物(本記事ではインターネットゲートウェイとルートテーブルを作成)
<img width="541" alt="スクリーンショット 2019-07-15 20.00.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324032/a6a160b0-bf3b-eaba-63f9-7367dddae2aa.png">

# github格納先
成果物のコードは下記githubのリポジトリに格納していきます。
https://github.com/sasshi-i/terraform_ec2_rds

# # ディレクトリ構成
```
├─ envs
│    ├─ prod
│    │   ├─ backend.tf
│    │   ├─ main.tf
│    │   └─ variables.tf
│    │
│    └─ staging
│        ├─ backend.tf
│        ├─ main.tf
│        └─ variables.tf
├─ modules
│    ├─ provider
│    │   └─ main.tf
│    └─ vpc
│        └─ main.tf
├─ .envrc
├─ .gigtgnore
└─READNE.md
```

# 今回追記したプログラム
```/modules/vpc/main.tf
resource "aws_internet_gateway" "qiita_igw" {
  vpc_id = aws_vpc.qiita_vpc.id
  tags = {
    Name = "igw-${var.stage}"
  }
}

resource "aws_route_table" "qiita_rtb_public" {
  vpc_id = aws_vpc.qiita_vpc.id
  tags = {
    Name = "rtb-${var.stage}-public"
  }
}

resource "aws_route_table_association" "qiita_rtb_assoc_pblic" {
  count          = 2
  route_table_id = aws_route_table.qiita_rtb_public.id
  subnet_id      = element([aws_subnet.qiita_subnet_1a[0].id, aws_subnet.qiita_subnet_1b[0].id], count.index)
}

resource "aws_route" "qiita_route_igw" {
  route_table_id         = aws_route_table.qiita_rtb_public.id
  destination_cidr_block = "0.0.0.0/0"
  gateway_id             = aws_internet_gateway.qiita_igw.id
  depends_on             = [aws_route_table.qiita_rtb_public]
}

resource "aws_route_table" "qiita_rtb_private" {
  vpc_id = aws_vpc.qiita_vpc.id
  tags = {
    Name = "rtb-${var.stage}-private"
  }
}

resource "aws_route_table_association" "qiita_rtb_assoc_private" {
  count          = 2
  route_table_id = aws_route_table.qiita_rtb_private.id
  subnet_id      = element([aws_subnet.qiita_subnet_1a[1].id, aws_subnet.qiita_subnet_1b[1].id], count.index)
}
```

# プログラムの解説
### インターネットゲートウェイ(IGW)
AWS上のリソースをインターネットに繋げるためにはインターネットゲートウェイが必要です。
`vpc_id`を指定するだけで作成できます。

### ルートテーブル
ルートテーブルを作成する際は下記の作成が必要になります。

- ルートテーブル->aws_route_table  
- ルートテーブルとサブネットの関連付け->aws_route_table_association  
- IGWへのルーティング(サブネットをインターネットに繋ぎたい場合)->aws_route  

#### aws_route_tableの解説
`vpc_id`を指定するだけです。名前をつけたければ`tags`で`Name`を指定します。

#### aws_route_table_associationの解説
`route_table_id`と`subnet_id`を指定してルートテーブルとサブネットを関連付けます。
自分が記載したプログラムでは`count`を指定してループで作成しています。
`element`は`terraform`が用意している関数で文法は下記の通りです。

```
element(list, index)
```

listからindex番目の要素を取得します。

#### aws_routeの解説
`destination_cidr_block`で送信先を指定します。今回は全てのIPアドレス範囲をインターネットに繋げるために`0.0.0.0/0`を指定しています。
また`depends_on`で依存を作成することができます。`aws_route_table`が存在しない場合は`aws_route`は存在し得ないので、`aws_route`を指定しています。


以上！`terraform apply`すればAWS上にリソースが作成されます。

# 結果
無事ルートテーブルが作成されました。

qiita_rtb_public
<img width="1003" alt="スクリーンショット 2019-08-12 22.45.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324032/5d0df1d6-7ff4-cb6f-ad73-b119e3d2099e.png">

<img width="1006" alt="スクリーンショット 2019-08-12 22.50.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324032/e9992b39-e3c7-598f-5728-1d66db9e9499.png">


qiita_rtb_private
<img width="1017" alt="スクリーンショット 2019-08-12 22.45.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324032/0e097335-d9ef-ac3f-8f47-06e2d039bc1f.png">

<img width="1007" alt="スクリーンショット 2019-08-12 22.51.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324032/d7472267-682c-d593-35b5-e30417228351.png">

# 関連記事
terraformでVPC, サブネットを作成する
https://qiita.com/sasshi_i/items/f4f65e18923d856be256

tfenvを用いたterraformのインストール方法
https://qiita.com/sasshi_i/items/b5117d51fed800fa6b09