🌐

Terraform 〜VPC作成〜

に公開

はじめに

この記事では、Terraformを使ってAWSのVPCを作成する手順を、できるだけシンプルに解説します。

Terraformのインストールや初期設定、AWSの認証設定などはすでに完了している前提とし、
「VPCって何?」というレベルから、実際にVPCが作成されるところまでをゴールにしています。

  • 今回は理解しやすさを優先し、
  • パブリックサブネットのみ
  • 最小限のリソース構成

に絞っています。
「Terraformは触れるけど、ネットワークはよく分からない」という方の、最初の一歩になれば嬉しいです。

VPCとは何か

VPC(Virtual Private Cloud)は、AWS上に作る自分専用のネットワークです。
EC2やRDSなどのAWSリソースは、このVPCの中に配置されます。

VPCを作ると、「どのIPアドレスを使うか」「インターネットに接続できるか」といった、
ネットワークの範囲やルールを自分で決められるようになります。
逆に言うと、VPCがないとAWS上にサーバーを安全に配置できません。

今回は細かいネットワーク設計は考えず、「AWSで何かを動かすために、まず必要な箱」としてVPCを作っていきます。

今回作るVPC構成

今回は、以下の構成でVPCを作成します。

  • VPC:1つ
  • パブリックサブネット:1つ
  • プライベートサブネット:1つ
  • インターネットゲートウェイ:1つ
  • ルートテーブル:1つ

この構成では、パブリックサブネット内のリソースがインターネットと通信できる状態になります。

構成の考え方

VPCの中に、役割の異なる2つのサブネットを作成します。

  • パブリックサブネット
    インターネットゲートウェイへ向かうルートを持ち、インターネットと直接通信できるサブネットです。
    今回は、インターネットから通信する可能性のあるリソースをここに配置する想定です。

  • プライベートサブネット
    インターネットへ直接は出られないサブネットです。
    外部から直接アクセスされたくないリソースを配置するために使われます。

今回はNAT Gatewayなどは作成しないため、プライベートサブネットからインターネットへの通信はできません。
この点は「そういうもの」として押さえておけばOKです。

Terraformでの作り方(全体の流れ)

Terraformでは、以下の順番でリソースを作成していきます。

  1. VPCを作成する
  2. パブリックサブネットとプライベートサブネットを作成する
  3. インターネットゲートウェイを作成し、VPCに紐づける
  4. ルートテーブルを作成し、パブリックサブネットに関連付ける

ルートテーブルは、パブリックサブネットのみに関連付けます。
プライベートサブネットは、インターネットへ出るルートを持たないためです。

次の章から、この構成を Terraformのコードを書きながら順番に作成していきます。

VPCを作成する

まずは、すべての土台となる VPC を作成します。
VPCは、このあと作るサブネットやルートテーブルをまとめる「箱」のようなものです。

CIDRとは何か

VPCを作成するときに必ず指定するのが CIDR です。
CIDRは、「このVPCで使うIPアドレスの範囲」 を表しています。

今回は深く考えず、よく使われる以下の値を使います。

10.0.0.0/16

これは「10.0.0.0 〜 10.0.255.255 まで使える」くらいの理解でOKです。

VPCのTerraformコード

VPCは aws_vpc リソースを使って定義します。

resource "aws_vpc" "vpc" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "sample-vpc"
  }
}

それぞれの設定は以下の意味を持っています。

  • cidr_block:VPCで使うIPアドレスの範囲
  • tags:AWSマネジメントコンソールで分かりやすくするための名前

この時点では、VPCを作っただけで、まだインターネットとはつながっていません
次の章では、このVPCの中に パブリックサブネットプライベートサブネットを作成していきます。

サブネットを作成する

次に、作成したVPCの中にパブリックサブネットプライベートサブネットを作成します。
サブネットは、VPCのIPアドレス範囲をさらに分割したものです。

サブネットのCIDRについて

今回は、VPCのCIDR(10.0.0.0/16)を以下のように分けて使います。

  • パブリックサブネット:10.0.1.0/24
  • プライベートサブネット:10.0.2.0/24

CIDRを決めるときのルールは以下の通りです。

  • VPCのCIDRの範囲内であること
  • 他のサブネットとCIDRが重ならないこと
  • 将来サブネットを増やせる余裕を残すこと

パブリックサブネットを作成する

まずは、インターネットと通信する想定のパブリックサブネットを作成します。

resource "aws_subnet" "public_1a" {
  vpc_id            = aws_vpc.vpc.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "ap-northeast-1a"

  tags = {
    Name = "public-subnet"
  }
}

プライベートサブネットを作成する

続いて、インターネットから直接アクセスされないプライベートサブネットを作成します。

resource "aws_subnet" "private_1a" {
  vpc_id            = aws_vpc.vpc.id
  cidr_block        = "10.0.2.0/24"
  availability_zone = "ap-northeast-1a"

  tags = {
    Name = "private-subnet"
  }
}

この時点では、パブリック・プライベートどちらのサブネットもまだインターネットには接続されていません。
次の章では、インターネットと通信するために必要なインターネットゲートウェイとルートテーブルを作成していきます。

インターネットに接続する設定

インターネットと通信するためには、インターネットゲートウェイとルートテーブルの設定が必要です。

インターネットゲートウェイとは

インターネットゲートウェイ(Internet Gateway)は、VPCとインターネットをつなぐための出入口です。
VPCにインターネットゲートウェイをアタッチすることで、はじめて「外の世界」と通信できるようになります。

インターネットゲートウェイを作成する

Terraformでは aws_internet_gateway リソースを使います。

resource "aws_internet_gateway" "igw" {
  vpc_id = aws_vpc.vpc.id

  tags = {
    Name = "sample-igw"
  }
}

これで、VPCにインターネットゲートウェイが紐づいた状態になります。

ただし、まだサブネットからインターネットへ通信することはできません。
次にルートテーブルを設定します。

ルートテーブルとは

ルートテーブルは、「この通信はどこへ向かうか」 を決めるルールです。
例えば、

  • インターネット宛の通信(0.0.0.0/0)は
    → インターネットゲートウェイへ送る

といった設定を行います。

ルートテーブルを作成する

まず、ルートテーブルを作成します。

resource "aws_route_table" "public" {
  vpc_id = aws_vpc.vpc.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.igw.id
  }

  tags = {
    Name = "public-route-table"
  }
}

この設定により、

  • インターネット宛(0.0.0.0/0)の通信
    → インターネットゲートウェイへ

というルールが作られます。

ルートテーブルをサブネットに関連付ける

最後に、このルートテーブルをパブリックサブネットに関連付けます。

resource "aws_route_table_association" "public" {
  subnet_id      = aws_subnet.public_1a.id
  route_table_id = aws_route_table.public.id
}

これで、

  • パブリックサブネット
    → インターネットに通信できる

  • プライベートサブネット
    → インターネットに通信できない

という構成になります。

今回は ルートテーブルは1つだけ 作成し、パブリックサブネットのみに関連付けている点がポイントです。

Terraformを実行する(plan / apply)

ここまでで、VPC構成に必要なTerraformコードはすべて書き終わりました。
いよいよ、Terraformを実行してAWS上にリソースを作成します。

terraform plan を実行する

まずは terraform plan を実行します。

terraform plan

この時点では、まだAWS上には何も作成されません。
出力結果の中に、

  • VPC
  • サブネット
  • インターネットゲートウェイ
  • ルートテーブル

などが表示されていれば、Terraformの設定は正しく読み込まれています。
エラーが出た場合は、リソース名のタイプミスや、参照しているリソースが存在するかを確認してみてください。

terraform apply を実行する

次に、terraform apply を実行して、実際にAWS上にリソースを作成します。

terraform apply

実行すると、「本当に適用していいですか?」という確認が表示されます。
問題なければ、yes と入力して Enter を押します。

最後に Apply complete! Resources: 6 added, 0 changed, 0 destroyed と表示されれば、実行は成功です 🎉

AWSマネジメントコンソールで確認する

Terraformの apply が成功したら、AWSマネジメントコンソールで実際にリソースが作成されているかを確認してみましょう。

VPCの確認

  1. AWSマネジメントコンソールにログイン
  2. VPC サービスを開く
  3. 「VPC」一覧を確認する

sample-vpc が表示されていれば、VPCは正しく作成されています。
VPC

サブネットの確認

次に、サブネットを確認します。

  1. VPCサービス内の「サブネット」を開く
  2. 一覧から作成したVPCを選択する

以下の2つが存在すればOKです。

  • public-subnet
  • private-subnet

それぞれのCIDRが10.0.1.0/2410.0.2.0/24になっていることも確認してみてください。
サブネット

ルートテーブルの確認

次に、ルートテーブルを確認します。

  1. VPCサービス内の「ルートテーブル」を開く
  2. public-route-table を選択する

ルートに、「0.0.0.0/0 → インターネットゲートウェイ」が設定されていれば、パブリックサブネットがインターネットと通信できる状態です。
ルートテーブル

また、「サブネットの関連付け」でパブリックサブネットのみが関連付けられていることも確認してみましょう。
サブネット関連付け

おわりに

この記事では、Terraformを使って最小構成のVPCを作成しました。
もし作成したリソースを削除する場合は、以下のコマンドを実行してください。

terraform destroy

Discussion