Terraformでネットワークを作成 module使用

## はじめに
初めまして、こうへいです。今回からTerraformの記事を作成していきます。
Terraformを用いてAWSのアーキテクチャを構築することで、AWSのコンソールから確認することなくコードを見るだけでAWSの構成がわかるので、非常に便利だと思います。

#### 記事の概要
TerraformでAWSのネットワークを作成したいと思います。今回はRegistryにあるmoduleを使用します。

#### 記事執筆の背景
趣味でregistryのmoduleを使用してネットワークを作成しようとしたときに、
せっかくなら記事にしてみようと考えました。

#### 想定読者
- AWSのネットワークをTerraformで構築しようと考えてる方
- registryのmoduleを使用して、構築したい方

## 今回作成するアーキテクチャ
![ネットワーク.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2148800/a255a544-2536-32c2-d657-c34bdbf18947.png)

## 今回作成するAWSリソース
- VPC
- Subnet
- Route-Table
- Internet-Gateway
- Elastic-Ip
- Nat-Gateway

#### ディレクトリ構成

```bash
.
├── modules
│   └── network
│       └── main.tf # networkを作成
└── provider.tf # networkのmoduleを呼び出し
```

## Terraformのコードと解説
provider.tfではこのようにnetworkのmoduleを呼び出しています。
```terraform:provider.tf
terraform {
  required_version = "1.3.9"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~>5.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

module "network" {
  source = "./modules/network"
}
```

modules/network/main.tfではこのようなコードを作成しました。
```terraform:modules/network/main.tf
module "network" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "5.1.1"

  cidr                    = "10.0.0.0/24"                              # VPCのcidr
  azs                     = ["ap-northeast-1a", "ap-northeast-1c"]     # 展開するAZ
  public_subnets          = ["10.0.0.0/26", "10.0.0.64/26"]            # public-subnetのcidr
  private_subnets         = ["10.0.0.128/26", "10.0.0.192/26"]         # private-subnetのcidr
  public_subnet_names     = ["public-subnet-1a", "public-subnet-1c"]   # public-subnetの名前
  private_subnet_names    = ["private-subnet-1a", "private-subnet-1c"] # private-subnetの名前
  enable_dns_hostnames    = true                                       # DNSホスト名を有効化
  enable_dns_support      = true                                       # DNS解決を有効化
  enable_nat_gateway      = true                                       # NatGatewayを有効化
  one_nat_gateway_per_az  = true                                       # 1AZに対してNatGatewayを作成
  map_public_ip_on_launch = true                                       # publicサブネットにIPv4を自動割り当てる

  vpc_tags                 = { Name = "vpc" }
  public_route_table_tags  = { Name = "route-table-public" }
  private_route_table_tags = { Name = "route-table-private" }
  igw_tags                 = { Name = "internet-gateway" }
  nat_gateway_tags         = { Name = "nat-gateway" }
  nat_eip_tags             = { Name = "elatic-ip" }
}
```

<details><summary>コード解説</summary>

- cidr : VPCのcidr
- azs :  展開するAZ名
- public_subnets : public-subnetのcidr
- private_subnets : private-subnetのcidr
- public_subnet_names : public-subnetの名前
- private_subnet_names : private-subnetの名前
- enable_dns_hostnames : DNSホスト名を有効化
- enable_dns_support : DNS解決を有効化
- enable_nat_gateway : NatGatewayを有効化
- one_nat_gateway_per_az : 1AZに対してNatGatewayを作成
- map_public_ip_on_launch : publicサブネットにIPv4を自動割り当てる
</details>

Nat-GatewayをAZごとに作成するのではなく、
一つしか作成したくないという場合はこのようにコードを書くと作成できます。

```bash:Nat-Gatewayを1つしか作成しない
  enable_dns_hostnames    = true                                       # DNSホスト名を有効化
  enable_dns_support      = true                                       # DNS解決を有効化
  enable_nat_gateway      = true                                       # NatGatewayを有効化
  one_nat_gateway_per_az  = false                                      # 1AZに対してNatGatewayを作成しない
  single_nat_gateway      = true                                       # NatGatewayを1つしか作成しない
  map_public_ip_on_launch = true                                       # publicサブネットにIPv4を自動割り当てる
```

## 振り返り
今回はRegistryにあるmoduleを使用してネットワークを作成しました。
NatGatewayは料金がかかりますので、不要なら必ずリソースを削除してください。

こちらの[サイト](https://aws-rough.cc/vpc/)を元に料金計算すると、1つのNatGatewayあたり6,703円かかりますのでご注意ください。(2023/9/10現在)

今回作成したgithubのリポジトリ : https://github.com/hikobend/terraform-qiita
ブランチ : https://github.com/hikobend/terraform-qiita/pull/1

## 今後作成予定の記事
- セキュリティグループの作成
- Terraform Plan ・ ApplyのCIを作成