TerraformでVPC基盤の作成


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

皆様こんにちは。
今回はTerraformを利用してAWSで高可用性アーキテクトの構築をしていきます。
この記事ではVPC基盤の作成を行います。

1.高可用性アーキテクト構築目次

目次はこちら

2.VPC基盤構成図

3.VPC概要

Amazon Virtual Private Cloud (Amazon VPC) を使用すると、定義した仮想ネットワーク内で AWS リソースを起動できます。仮想ネットワークは、お客様自身のデータセンターで運用されていた従来のネットワークによく似ていますが、 AWS のスケーラブルなインフラストラクチャを使用できるというメリットがあります。

引用元:Amazon VPC とは?

高可用性アーキテクトを構築する上で、可用性を高めるため仮想ネットワークを論理的に分離し、リソースをマルチAZ配置にするためにこのAmazon VPCを利用します。
類似サービスとして、GCPの「Virtual Private Cloud」、Azureの「Azure Virtual Network」等が挙げられます。
VPCを利用するメリットとして下記3つがあります。

  • クラウド上で仮想ネットワークを簡単に構築できる
  • インターネットを使わないセキュアな通信もできる
  • 便利なコンポーネントが多くカスタマイズ性が高い

4.VPCの作成

下記は作成したVPC基盤全体のソースコードです。

#----------------------------------------
# VPCの作成
#----------------------------------------
resource "aws_vpc" "higa-vpc" {
  cidr_block           = "10.0.0.0/21"
  enable_dns_hostnames = true
  enable_dns_support   = true

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

#----------------------------------------
# サブネットの作成
#----------------------------------------

# パブリックサブネットの作成
resource "aws_subnet" "higa-Public-subnet-1a" {
  vpc_id            = aws_vpc.higa-vpc.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "ap-southeast-1a"
  #パブリック IPv4 アドレスの自動割り当て
  map_public_ip_on_launch = true

  tags = {
    Name = "higa-Public-subnet-1a"
  }
}

resource "aws_subnet" "higa-Public-subnet-2c" {
  vpc_id            = aws_vpc.higa-vpc.id
  cidr_block        = "10.0.2.0/24"
  availability_zone = "ap-southeast-1c"
  #パブリック IPv4 アドレスの自動割り当て
  map_public_ip_on_launch = true

  tags = {
    Name = "higa-Public-subnet-2c"
  }
}

# プライベートサブネットの作成
resource "aws_subnet" "higa-Private-subnet-3a" {
  vpc_id            = aws_vpc.higa-vpc.id
  cidr_block        = "10.0.3.0/24"
  availability_zone = "ap-southeast-1a"

  tags = {
    Name = "higa-Private-subnet-3a"
  }
}

resource "aws_subnet" "higa-Private-subnet-4c" {
  vpc_id            = aws_vpc.higa-vpc.id
  cidr_block        = "10.0.4.0/24"
  availability_zone = "ap-southeast-1c"

  tags = {
    Name = "higa-Private-subnet-4c"
  }
}

#----------------------------------------
# インターネットゲートウェイの作成
#----------------------------------------
resource "aws_internet_gateway" "higa-internet-gateway" {
  vpc_id = aws_vpc.higa-vpc.id

  tags = {
    Name = "higa-internet-gateway"
  }
}
#----------------------------------------
# ルートテーブルの作成
#----------------------------------------

#  パブリックサブネットのルートテーブルの作成
resource "aws_route_table" "higa-Public-rtb" {
  vpc_id = aws_vpc.higa-vpc.id
  #インターネットゲートウェイ向けのルート追加
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.higa-internet-gateway.id
  }

  tags = {
    Name = "higa-Public-rtb"
  }
}

#  プライベートサブネットのルートテーブルの作成
resource "aws_route_table" "higa-Private-rtb" {
  vpc_id = aws_vpc.higa-vpc.id

  tags = {
    Name = "higa-Private-rtb"
  }
}

#----------------------------------------
# サブネットにルートテーブルを紐づけ
#----------------------------------------

# パブリックサブネットにルートテーブルを紐づけ
resource "aws_route_table_association" "higa-Public-subnet-1a_rt_assocication" {
  subnet_id      = aws_subnet.higa-Public-subnet-1a.id
  route_table_id = aws_route_table.higa-Public-rtb.id
}

resource "aws_route_table_association" "higa-Public-subnet-2c_rt_assocication" {
  subnet_id      = aws_subnet.higa-Public-subnet-2c.id
  route_table_id = aws_route_table.higa-Public-rtb.id
}

# プライベートサブネットにルートテーブルを紐づけ
resource "aws_route_table_association" "higa-Private-subnet-3a_rt_assocication" {
  subnet_id      = aws_subnet.higa-Private-subnet-3a.id
  route_table_id = aws_route_table.higa-Private-rtb.id
}

resource "aws_route_table_association" "higa-Private-subnet-4c_rt_assocication" {
  subnet_id      = aws_subnet.higa-Private-subnet-4c.id
  route_table_id = aws_route_table.higa-Private-rtb.id
}

4-1.VPCの作成

VPCを作成していきます。(1~12行目)

#----------------------------------------
# VPCの作成
#----------------------------------------
resource "aws_vpc" "higa-vpc" {
  cidr_block           = "10.0.0.0/21"
  enable_dns_hostnames = true
  enable_dns_support   = true

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

今回作成するVPCの設定項目は下記の通りです。

使用するオプション 設定値 説明
cidr_block 10.0.0.0/21 設定したいCIDRを入力
enable_dns_hostnames true DNS ホスト名を有効化
enable_dns_support true DNS 解決を有効化
tags Name = "higa-vpc" Nameの表記を設定

これでVPCの作成ができました。

5.サブネット

VPC作成時に「どの程度IPアドレスを確保するか」を決定します。しかし、セキュリティやルーティングなどを管理しやすくするため、VPCで確保した大きなネットワーク空間を複数の小さなネットワークに分割して利用します。分割したネットワークのことをサブネットと呼びます。
サブネットを構築する際、サブネットがどの程度IPアドレスを確保するか範囲を指定する必要があり、このサブネットの範囲のことをサブネットマスクと呼びます。

また、インターネットに接続されている(インターネットゲートウェイへのルート先がある)サブネットをパブリックサブネット、インターネットに接続されていないサブネットをプライベートサブネットと呼びます。
引用元:AWSエンジニア入門講座――学習ロードマップで体系的に学ぶ

シンガポールリージョンのAZ1aとAZ1cにそれぞれパブリックサブネットとプライベートサブネットを1つずつ作成していきます。
マルチAZ構成で冗長化することにより可用性が高められます。

5-1.パブリックサブネットの作成

まず、パブリックサブネットを作成します。(18~29行目)

# パブリックサブネットの作成
resource "aws_subnet" "higa-Public-subnet-1a" {
  vpc_id            = aws_vpc.higa-vpc.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "ap-southeast-1a"
  #パブリック IPv4 アドレスの自動割り当て
  map_public_ip_on_launch = true

  tags = {
    Name = "higa-Public-subnet-1a"
  }
}

resource "aws_subnet" "higa-Public-subnet-2c" {
  vpc_id            = aws_vpc.higa-vpc.id
  cidr_block        = "10.0.2.0/24"
  availability_zone = "ap-southeast-1c"
  #パブリック IPv4 アドレスの自動割り当て
  map_public_ip_on_launch = true

  tags = {
    Name = "higa-Public-subnet-2c"
  }
}

パブリックサブネットの設定項目は下記の通りです。

使用するオプション 設定値 説明
vpc_id aws_vpc.higa-vpc.id VPCの指定
cidr_block 10.0.1.0/24
10.0.2.0/24
設定したいCIDRを入力
availability_zone ap-southeast-1a
ap-southeast-1c
アベイラビリティゾーンの指定
map_public_ip_on_launch true パブリックIPv4アドレスの自動割り当ての設定
tags Name = "higa-Public-subnet-1a"
Name = "higa-Public-subnet-2c"
Nameの表記を設定

パブリックサブネットは、パブリックIPv4アドレスの自動割り当てを有効にします。

5-2プライベートサブネットの作成

次にプライベートサブネットを作成します。(43~52行目)

# プライベートサブネットの作成
resource "aws_subnet" "higa-Private-subnet-3a" {
  vpc_id            = aws_vpc.higa-vpc.id
  cidr_block        = "10.0.3.0/24"
  availability_zone = "ap-southeast-1a"

  tags = {
    Name = "higa-Private-subnet-3a"
  }
}

resource "aws_subnet" "higa-Private-subnet-4c" {
  vpc_id            = aws_vpc.higa-vpc.id
  cidr_block        = "10.0.4.0/24"
  availability_zone = "ap-southeast-1c"

  tags = {
    Name = "higa-Private-subnet-4c"
  }
}

プライベートサブネットの設定項目は下記の通りです。

使用するオプション 設定値 説明
vpc_id aws_vpc.higa-vpc.id VPCの指定
cidr_block 10.0.3.0/24
10.0.4.0/24
設定したいCIDRを入力
availability_zone ap-southeast-1a
ap-southeast-1c
アベイラビリティゾーンの指定
tags Name = "higa-Private-subnet-3a"
Name = "higa-Private-subnet-4c"
Nameの表記を設定

6.インターネットゲートウェイ

インターネットゲートウェイは、VPCとインターネットを接続するための接続口です。
各VPCに一つだけアタッチすることができます。

引用元:AWS認定資格試験テキスト AWS認定ソリューションアーキテクト – アソシエイト 改訂第2版

6-1.インターネットゲートウェイの作成

インターネットゲートウェイの作成をします。(67~73行目)

#----------------------------------------
# インターネットゲートウェイの作成
#----------------------------------------
resource "aws_internet_gateway" "higa-internet-gateway" {
  vpc_id = aws_vpc.higa-vpc.id

  tags = {
    Name = "higa-internet-gateway"
  }
}

インターネットゲートウェイの設定項目は下記の通りです。

使用するオプション 設定値 説明
vpc_id aws_vpc.higa-vpc.id VPCの指定
tags Name = "higa-internet-gateway" Nameの表記を設定

7.ルートテーブル

分割したネットワーク同士を通信させるためには通信経路を作成する必要があります。この通信経路のことをルートと呼び、ルートをまとめたデータ構造のことをルートテーブルといいます。

引用元:AWSエンジニア入門講座――学習ロードマップで体系的に学ぶ

パブリック用(インターネットと通信するため)とプライベート用の2つのルートテーブルを作成し、それぞれ設定していきます。

7-1.パブリックサブネットのルートテーブルの作成

まずは、パブリックサブネットのルートテーブルの作成をします。(78~90行目)

#  パブリックサブネットのルートテーブルの作成
resource "aws_route_table" "higa-Public-rtb" {
  vpc_id = aws_vpc.higa-vpc.id
  #インターネットゲートウェイ向けのルート追加
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.higa-internet-gateway.id
  }

  tags = {
    Name = "higa-Public-rtb"
  }
}

パブリックサブネットのルートテーブルの設定項目は下記の通りです。

使用するオプション 設定値 説明
vpc_id aws_vpc.higa-vpc.id VPCの指定
cidr_block 0.0.0.0/0 設定したいCIDRを入力
gateway_id aws_internet_gateway.higa-internet-gateway.id インターネットゲートウェイの指定
tags Name = "higa-Public-rtb" Nameの表記を設定

パブリックサブネット用のルートテーブルにはインターネットゲートウェイを指定します。

7-2.プライベートサブネットのルートテーブルの作成

次に、プライベートサブネットのルートテーブルの作成をします。(92~99行目)

#  プライベートサブネットのルートテーブルの作成
resource "aws_route_table" "higa-Private-rtb" {
  vpc_id = aws_vpc.higa-vpc.id

  tags = {
    Name = "higa-Private-rtb"
  }
}

プライベートサブネットのルートテーブルの設定項目は下記の通りです。

使用するオプション 設定値 説明
vpc_id aws_vpc.higa-vpc.id VPCの指定
tags Name = "higa-Private-rtb" Nameの表記を設定

8.ルートテーブルの紐づけ

作成したルートテーブルをサブネットに紐づけます。
パブリック用とプライベート用それぞれの紐づけをします。

8-1.パブリックサブネットにルートテーブルを紐づけ

まずは、パブリックサブネットにルートテーブルの紐づけをします。(105~114行目)

# パブリックサブネットにルートテーブルを紐づけ
resource "aws_route_table_association" "higa-Public-subnet-1a_rt_assocication" {
  subnet_id      = aws_subnet.higa-Public-subnet-1a.id
  route_table_id = aws_route_table.higa-Public-rtb.id
}

resource "aws_route_table_association" "higa-Public-subnet-2c_rt_assocication" {
  subnet_id      = aws_subnet.higa-Public-subnet-2c.id
  route_table_id = aws_route_table.higa-Public-rtb.id
}

パブリックサブネット用のルートテーブルの設定項目は下記の通りです。

使用するオプション 設定値 説明
subnet_id aws_subnet.higa-Public-subnet-1a.id
aws_subnet.higa-Public-subnet-2c.id
サブネットの指定
route_table_id aws_route_table.higa-Public-rtb.id ルートテーブルの指定

8-2.プライベートサブネットにルートテーブルを紐づけ

次に、プライベートサブネットにルートテーブルの紐づけをします。(116~125行目)

# プライベートサブネットにルートテーブルを紐づけ
resource "aws_route_table_association" "higa-Private-subnet-3a_rt_assocication" {
  subnet_id      = aws_subnet.higa-Private-subnet-3a.id
  route_table_id = aws_route_table.higa-Private-rtb.id
}

resource "aws_route_table_association" "higa-Private-subnet-4c_rt_assocication" {
  subnet_id      = aws_subnet.higa-Private-subnet-4c.id
  route_table_id = aws_route_table.higa-Private-rtb.id
}

プライベートサブネット用のルートテーブルの設定項目は下記の通りです。

使用するオプション 設定値 説明
subnet_id aws_subnet.higa-Private-subnet-3a.id
aws_subnet.higa-Private-subnet-4c.id
サブネットの指定
route_table_id aws_route_table.higa-Private-rtb.id ルートテーブルの指定

以上で、TerraformによるVPC関連の構築は完了しました。

9.まとめ

ここまで閲覧いただきありがとうございました。
今回のでVPC基盤(VPC,サブネット、インターネットゲートウェイ、ルートテーブル)の構築はterraformの公式ドキュメントを参考にし、スムーズに構築できました。
TerraformでVPC基盤の作成をしてみて、コードを見ればVPC基盤の設定をどのようにしているのか一目で分かるので、大変便利だと感じました。
設定項目の変更を行いたい場合、コードを追加・修正すれば簡単にできるので、マネジメントコンソール画面から行うよりも便利だと感じました。

10.参考文献

Last modified: 2022-06-24

Author