Terraform講座：実際にリソースを作ってみよう①VPC・サブネット編

## 今回の記事について
今回は、Terraform講座の第四回として、Terraformを使って実際にリソースを構築してみます！前回の記事は、[こちら](https://qiita.com/aaaaa_326/items/74563f1e25c0fdc8d888)からどうぞ！
長くなるので、2回に分けてお送りする予定です！
## 本ハンズオンで作る環境
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942158/ddbe7383-3e56-4116-99ee-30acf2a0e1cd.png)

画像のようにVPC、パブリックサブネットを作成し、この中にEC2を作成します。
また、この時、EC2は自分のPCからSSHでアクセスが出来るように設定します。

そして、本記事では、VPCとパブリックサブネットの作成について行います。
では、コードを書く前に、まずは**設計**をしていきましょう。設計をすることで、コードを書く作業がより楽になります。

## 設計
VPCやサブネットにおけるCIDRの設計については、どれくらいのリソースを確保する想定かによって変わり想定を満たすよりも少し多めにIPアドレスを割り当てられるようにしておきましょう。
しかし、今回は、計算を楽にしたいので（）次のようにしたいと思います。

| リソース | アドレス / CIDR |
| ---- | ---- |
| VPC | 10.0.0.0/16 |
| サブネット | 10.0.1.0/24 |

また、パブリックサブネットの作成には、VPCとインターネットを直接的につなぐインターネットゲートウェイ、およびサブネットの通信経路を定義するルートテーブルが必要です。本記事では、これらの作成も行います！


## 各ファイルについて
### フォルダ構成
```
root
  ├─ backend.tf
  ├─ main.tf
  ├─ provider.tf
  ├─ .terraform-version
  ├─ version.tf
  └─ modules
       ├─ vpc.tf  
       ├─ subnet.tf
       ├─ route_table.tf
       ├─ igw.tf
       └─ ec2.tf
```

本ハンズオンでは、次のようなフォルダ構成を考えています。
今回stateファイルは、S3バケットに保存することを想定します。そのバケットはあらかじめ、マネージメントコンソールから作成しておきましょう。そして、`backend.tf`は次のように記述します。
```backend.tf
terraform {
    backend "s3" {
        bucket = "test-bucket-for-tfstate"
        key    = "test/terraform.tfstate"
        region = "ap-northeast-1"
        acl    = "bucket-owner-full-control"
    }
}
```
また、今回 `provider.tf`については、東京リージョンだけ使う & お試しなので、1行で終わらせちゃいますね！ (カスタムしたい方はご自身で調べてください！)
```provider.tf
provider "aws" {
    region = "ap-northeast-1"
}
```
あとは、terraformのバージョンを1.10.5として、VPCとパブリックサブネットを作っていきましょう
### リソースのコード
```vpc.tf 
resource "aws_vpc" "test_vpc" {
    cidr_block = "10.0.0.0/16"

    tags = {
        Name = # 好きな名前を入れてください！
    }
}

```

```subnet.tf
resource "aws_sbunet" "test_public" {
    vpc_id     = aws_vpc.test_vpc.id
    cidr_block = "10.0.1.0/24"

    tags = {
        Name = # 好きな名前を入れてください！
    }
}
```

サブネットに関しては、東京リージョン内の適当なアベイラビリティゾーン (AZ) に作成されます。もしAZ単位で指定したい場合は次の文を3行目の次に付け加えてください。
```
    availability_zone = "ap-northeast-1a"
```

残りのインターネットゲートウェイ、およびルートテーブルは次の通りです。
```igw.tf
resource "aws_internet_gateway" "test_igw" {
    vpc_id = aws_vpc.test_vpc.id

    tags = {
        Name = # 好きな名前を入れてください！
    }
}
```

```route_table.tf
# ルートテーブルの作成
resource "aws_route_table" "test_rtb" {
    vpc_id = aws_vpc.test_vpc.id

    tags = {
        Name = # 好きな名前を入れてください！
    }
}

# ルートテーブルとサブネットが通るゲートウェイを定義
resource "aws_route" "test_route" {
    destination_cidr_block = "0.0.0.0/0"
    route_table_id         = aws_route_table.test_rtb.id
    gateway_id             = aws_internet_gateway.test_igw.id
}

# ルートテーブルを通るサブネットを定義
resource "aws_route_table_association" "test_rtb_ass" {
    subnet_id      = aws_subnet.test_public.id
    route_table_id = aws_route_table.test_rtb.id
}
```


### main.tf
最後に、terraformのCLIで、記述したリソースを構築するために`main.tf`を記述します。
これは簡単です。対象のモジュールさえ指定すれば作ってくれます！
```main.tf
module "resources-tokyo" {
    source = "./modules/"
}
```

## リソース構築
では、構築していきましょう！[前回の記事](https://qiita.com/aaaaa_326/items/74563f1e25c0fdc8d888)のリソース構築の手順に従ってやってください。
本記事では、手順3の実行が終わった (特筆することが無いため)　後のことを書きます。

**① (手順4-1)：Planを行う。**
Plan結果は、VPCとサブネットが作成されるので
```
Plan: 6 to add, 0 to change, 0 to destroy.
```
が最後に表示されているはずです。
また、これと一致しているからといってすぐapplyを行うのは危険です！最初は、しっかり何が作られるのかログを見ましょう！

**② (手順4-2)：問題が無いことを確認したうえで、applyを行い、リソース構築！**

最後に、自身が設定したAWSアカウントにログインしたうえで、今回作成したリソースが全て作成されていることを確認してハンズオン前編は終了です！！

## まとめ
今回は、実際にハンズオン形式で、VPCとパブリックサブネットを構築し、EC2を構築するための土台が完成しました！
[次回](https://qiita.com/aaaaa_326/items/bfb0c9c2a9c55bedfa34)、講座最終回です！サブネット上にEC2を構築してSSHでアクセスしてみましょう！