メインコンテンツへスキップ

VPCとサブネット設計をTerraformで構築する

·
インフラ AWS Terraform ハンズオン・チュートリアル
目次

今日学んだこと
#

「Amazon Web Services 基礎からのネットワーク&サーバー構築」のハンズオンをTerraformで再構築しました。VPCとサブネットの設計から、パブリック/プライベートの違いがルートテーブルの設定で決まることを実践を通じて理解しました。

学習内容
#

構築するリソース
#

リソース名前CIDR / AZ
VPCpractice-vpc10.0.0.0/16
パブリックサブネットpractice-public-subnet10.0.1.0/24 (ap-northeast-1a)
パブリックサブネット2practice-public-subnet-210.0.4.0/24 (ap-northeast-1c)
プライベートサブネットpractice-private-subnet10.0.2.0/24 (ap-northeast-1a)
プライベートサブネット2practice-private-subnet-210.0.3.0/24 (ap-northeast-1c)
Internet Gatewaypractice-igw-
ルートテーブル(パブリック)practice-public-rt0.0.0.0/0 → IGW
ルートテーブル(プライベート)practice-private-rtローカルのみ

VPCの作成
#

resource "aws_vpc" "main" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_hostnames = true
  enable_dns_support   = true

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

enable_dns_hostnames = true を設定することで、EC2にパブリックDNS名が割り当てられます。AWSコンソールでは「VPCの設定を編集」から有効化する操作が必要ですが、Terraformでは属性1つで完結します。

サブネットの作成
#

resource "aws_subnet" "public" {
  vpc_id                  = aws_vpc.main.id
  cidr_block              = "10.0.1.0/24"
  availability_zone       = "ap-northeast-1a"
  map_public_ip_on_launch = true

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

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

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

map_public_ip_on_launch = true はパブリックサブネットのみに設定します。プライベートサブネットにはパブリックIPが不要なため設定しません。

Internet Gatewayの作成
#

resource "aws_internet_gateway" "main" {
  vpc_id = aws_vpc.main.id

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

Terraformでは vpc_id を指定するだけでIGW作成とVPCへのアタッチが同時に実行されます。AWSコンソールでは「作成」→「VPCにアタッチ」の2ステップが必要な操作です。

ルートテーブルの作成
#

# パブリック用
resource "aws_route_table" "public" {
  vpc_id = aws_vpc.main.id

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

  tags = {
    Name = "practice-public-rt"
  }
}

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

# プライベート用
resource "aws_route_table" "private" {
  vpc_id = aws_vpc.main.id

  tags = {
    Name = "practice-private-rt"
  }
}

resource "aws_route_table_association" "private_1" {
  subnet_id      = aws_subnet.private_1.id
  route_table_id = aws_route_table.private.id
}

パブリックルートテーブルには 0.0.0.0/0 → IGW のルートを設定し、プライベートルートテーブルにはローカルルート(10.0.0.0/16)のみを設定します。このIGWへのルートがあるかどうかがパブリック/プライベートの違いになります。

なぜ2AZ構成にしたか
#

ALBは最低2つのAZが必要であり、RDSのDBサブネットグループも2AZ必須です。本番環境を意識した設計として、最初から2AZ構成にしました。

まとめ
#

トピック内容
パブリック/プライベートの違いサブネット作成時点では同じ。ルートテーブルにIGWへのルートがあるかで決まる
DNS設定enable_dns_hostnames = true でパブリックDNS名が割り当てられる
IGWアタッチTerraformでは vpc_id 指定でアタッチまで完了
明示的な関連付けルートテーブルにサブネットを関連付けないと、メインルートテーブルが適用される

参考
#