TerraformでVPCを構築してみる

# はじめに
Terraformの勉強を始めたので備忘録を兼ねて行ったことを投稿しようと思います。
以下の３つの投稿内容を実施した上でVPCの構築を行なっています。
※今まではデフォルトのVPCを使っていました
[TerraformをインストールしてTerraformでAWS上にEC2作ってみる](https://qiita.com/kakita-yzrh/items/1357a219b4a891a441ff)
[TerraformでIAMを設定してEC2にセッションマネージャー経由で接続してみる](https://qiita.com/kakita-yzrh/items/980f3209d587e7e349a6)
[Terraformでセキュリティグループを設定してEC2にhttp接続する](https://qiita.com/kakita-yzrh/items/6bdc11f2882c67a949ad)
# TerraformにVPCの定義を追加
### VPCを定義する
```terraform:vpc.tf
resource "aws_vpc" "test_vpc"{
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  tags = {
    Name = "tf_test"
  }
}
```

### サブネットを定義する
定義したVPCを指定してサブネットを定義します。
```terraform:vpc.tf
resource "aws_subnet" "test_subnet_a" {
  vpc_id            = aws_vpc.test_vpc.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "ap-northeast-1a"
  map_public_ip_on_launch = true
  tags = {
    Name = "tf_test"
  }
}
```
後ほどhttp接続確認のため、`map_public_ip_on_launch = true`にしてパブリックIPが自動的に付与されるようにしています。

### インターネットゲートウェイを定義する
定義したVPCを指定してインターネットゲートウェイを定義します。
```terraform:vpc.tf
resource "aws_internet_gateway" "test_igw" {
  vpc_id = aws_vpc.test_vpc.id
  tags = {
    Name = "tf_test"
  }
}
```

### ルートテーブルを定義する
定義したVPC内でどのIPアドレス宛の通信をインターネットゲートウェイへ向けるか定義します。
```terraform:vpc.tf
resource "aws_route_table" "test_rt" {
  vpc_id            = aws_vpc.test_vpc.id
  route {
    cidr_block      = "0.0.0.0/0"
    gateway_id      = aws_internet_gateway.test_igw.id
  }
  tags = {
    Name = "tf_test"
  }
}
```

### サブネットとルートテーブルを関連付け
```terraform:vpc.tf
resource "aws_route_table_association" "test_rt_associate" {
  subnet_id      = aws_subnet.test_subnet_a.id
  route_table_id = aws_route_table.test_rt.id
}
```

# デフォルトVPCで起動することを前提にしていたリソースを今回定義したVPCに変更する
## EC2を構築するサブネット指定する
以下で作成していた`ec2.tf`にEC2を構築するサブネットを指定します
https://qiita.com/kakita-yzrh/items/6bdc11f2882c67a949ad#ec2%E3%81%AB%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%9F%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E8%A8%AD%E5%AE%9A

```terraform:ec2.tf
resource "aws_instance" "test" {
  ami           = "ami-0404778e217f54308"
  instance_type = "t3.micro"

  iam_instance_profile = aws_iam_instance_profile.test.name

  # 以下を追加
  subnet_id = aws_subnet.test_subnet_a.id

  vpc_security_group_ids = [
    aws_security_group.test.id
  ]

  tags = {
    Name = "tf_test"
  }
}
```

## セキュリティグループのVPC指定
以下で作成していた`securitygroup.tf`にVPCを指定します。
https://qiita.com/kakita-yzrh/items/6bdc11f2882c67a949ad#http%E6%8E%A5%E7%B6%9A%E7%94%A8%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E5%AE%9A%E7%BE%A9
```terraform:securitygroup.tf
resource "aws_security_group" "test" {
  name = "tf_test"

  # 以下を追加
  vpc_id = aws_vpc.test_vpc.id

  tags = {
    Name = "tf_test"
  }
}
```

# Terraformで定義したVPCと変更したEC2とセキュリティグループを反映
### Terraformのplan applyを実行
terraformのplan applyを実行して、AWS上にリソースを反映します。
```
terraform plan
terraform apply
```

### http接続を行う
以下の時と同じ方法でVPCとサブネットが変わった後も接続できるか確認します。
https://qiita.com/kakita-yzrh/items/6bdc11f2882c67a949ad#http%E6%8E%A5%E7%B6%9A%E3%82%92%E8%A1%8C%E3%81%86

# 作成したリソースの削除
terraformのdestroyを実行して、AWS上のリソースを削除します。
```
terraform destroy
```

# さいごに
今回はTerraformでVPCの作成と作成したVPCにEC2インスタンスの構築を行いました。
次回は作成したVPCとEC2を使ってALBの作成を行いたいと思います。