Network

ネットワークリソースの関係

  • AZ ∈ Region 
  • Route ∈ Route Table ∈ Subnet ∈ VPC
  • Subnet <=> Route Table <=> Gateway <=> Internet

Range of Global IP address vs. Ragne of Private IP address

Global IP Address

Class A:	1.0.0.0 ~ 9.255.255.255
Class A:	11.0.0.0 ~ 126.255.255.255
Class B:	128.0.0.0 ~ 172.15.255.255
Class B:	172.32.0.0 ~ 191.255.255.255
Class C:	192.0.0.0 ~ 192.167.255.255
Class C:	192.169.0.0 ~ 223.255.255.255

Private Ip address

Class A	10.0.0.0 ~ 10.255.255.255
Class B	172.16.0.0 ~ 172.31.255.255
Class C	192.168.0.0 ~ 192.168.255.255

cidr_block

octet単位.で区切られる

10.0.0.0/24

CIDR Range	10.0.0.0/24
Netmask	255.255.255.0
Wildcard Bits	0.0.0.255
First IP	10.0.0.0
Last IP	10.0.0.255
Total Host	256

10.0.64.0/24

CIDR Range	10.0.64.0/24
Netmask	255.255.255.0
Wildcard Bits	0.0.0.255
First IP	10.0.64.0
Last IP	10.0.64.255
Total Host	256

https://www.ipaddressguide.com/cidr

VPC

resource "aws_vpc" "example" {
  cidr_block           = "10.0.0.0/16"
  enable_dns_support   = true <=========== resolve name by DNS of AWS
  enable_dns_hostnames = true <=========== add public DNS hostname in VPC automatically 
}

Public Subnet

resource "aws_subnet" "public" {
  vpc_id                  = aws_vpc.example.id
  cidr_block              = "10.0.0.0/24"
  map_public_ip_on_launch = true <========= automatically attach public ip address to the instance in this subnet
  availability_zone       = "ap-northeast-1a" <====== subnetはAZをまたげない
}

Internet Gateway

  • VPCは隔離されたネットワークなので単体ではインターネットと接続できない。
  • そこで、インターネットとGWを作成して、VPC <=> Interneで津神できるようにする
  • VPCのIDを指定する
resource "aws_internet_gateway" "example" {
  vpc_id = aws_vpc.example.id
}

Public network

Route tableの定義 (Public)

  • VPCとInternet GWだけだと、インターネット通信ができない。
  • ネットワークにデータを流すために、ルーティング情報を管理するRoute tableが必要
  • VPCのIDを指定する
  • public用のroute table
resource "aws_route_table" "public" {
  vpc_id = aws_vpc.example.id
}
  • VPC内の通信を有効にするために、ローカルルートが自動的に作成されるので注意
  • なお、このローカルルーとはTFから制御できないので注意!
Destination: 10.0.0.0/16
Target: local

Routeの作成

  • ルートはルートテーブルの1レコードに該当する
  • 下で作ったaws_routeaws_route_table_associationを使って関連付けしなかった場合は、デフォルトルートテーブルが自動的に選ばれる。
resource "aws_route" "public" {
  route_table_id         = aws_route_table.public.id
  gateway_id             = aws_internet_gateway.example.id
  destination_cidr_block = "0.0.0.0/0" <====== デフォルトルーと(0.0.0.0/0)を指定して、VPC以外への通信をインターネットゲートウェイ経由で流す
}

RouteとRoute tableとの関連付け

  • サブネットを指定してルーとを登録する
resource "aws_route_table_association" "public" {
  subnet_id      = aws_subnet.public.id
  route_table_id = aws_route_table.public.id
}

Private network

Private Subnet

resource "aws_subnet" "private" {
  vpc_id                  = aws_vpc.example.id
  cidr_block              = "10.0.64.0/24"
  availability_zone       = "ap-northeast-1a"
  map_public_ip_on_launch = false <================= public IPは不要なのでfalseに
}

Route tableの作成

resource "aws_route_table" "private" {
  vpc_id = aws_vpc.example.id
}

Route tableの関連付け

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

NATゲートウェイのためのEIP

  • NATゲートウェイにはEIP(Elastic IP Address)が必要
resource "aws_eip" "nat_gateway" {
  vpc        = true
  depends_on = [aws_internet_gateway.example]  <======== 暗黙的にIneternet GWに依存しているため
}

NATゲートウェイの作成

resource "aws_nat_gateway" "example" {
  allocation_id = aws_eip.nat_gateway.id
  subnet_id     = aws_subnet.public.idA <============= subnetはPublic Subnetを指定する
  depends_on    = [aws_internet_gateway.example] <======== 暗黙的にIneternet GWに依存しているため
}

ルートを作成

  • プライベートネットワークからインターネットへ通信するためのルートを作成
resource "aws_route" "private" {
  route_table_id         = aws_route_table.private.id <=========== Private SubnetのRoute Tableに追加する
  nat_gateway_id         = aws_nat_gateway.example.id <=========== GWはNAT GWを選択
  destination_cidr_block = "0.0.0.0/0" <=================== デフォルトルート(0.0.0.0/0)を指定して、VPC以外への通信をインターネットゲへ経由で流す
}