今回は、AWS SAPでも超頻出だったNAT GatewayをTerraformで構築していく。
ここまでで、
- VPC
- CIDR
- Subnet
- AZ
- Internet Gateway
- Route Table
- Route Table Association
を学んできた。
今回は、いよいよ
「Private SubnetにあるEC2は、どうやってインターネットへアクセスするのか?」
を考える。
まず質問
前回までに作った構成を思い出そう。
Internet
│
▼
Internet Gateway
│
▼
Route Table
│
▼
Public Subnet
│
▼
EC2
このEC2はインターネットへ出られる?
答え
YES。
Public SubnetがInternet Gatewayへ到達できるルートを持っているため、インターネットへ通信できる。
では、これはどうだろう。
Internet
│
▼
Internet Gateway
│
▼
Route Table
│
▼
Private Subnet
│
▼
EC2
このEC2はインターネットへ出られる?
考えてみよう
ここで重要なのは、
「Private Subnetだから出られない」
とだけ覚えないこと。
なぜ出られないのかを考える。
答え
そのままではインターネットへ出られない。
理由は、
Private SubnetからInternet Gatewayへ直接出ていくための構成になっていないから。
では、Private SubnetにあるEC2から、外部へアクセスしたい場合はどうする?
そこで登場するのが、
NAT Gateway
NAT Gatewayとは?
AWSでは、基本的に次のような構成にする。
Private EC2
│
▼
Private Route Table
│
▼
NAT Gateway
│
▼
Internet Gateway
│
▼
Internet
ここで重要なのは、
NAT GatewayはPublic Subnetに配置する
ということ。
NAT Gatewayを例えるなら
Public Subnetは、
道路につながった家
のようなもの。
家
│
▼
玄関
│
▼
道路
│
▼
外の世界
一方、Private Subnetは、
家の奥の部屋
のようなもの。
奥の部屋
×
玄関に直接出られない
そこでNAT GatewayをPublic Subnetに置く。
Private EC2
│
▼
NAT Gateway
│
▼
Internet Gateway
│
▼
Internet
NAT Gatewayは、Private SubnetにあるEC2の外部への通信を中継する役割を持っている。
イメージとしては、
「外に出たい?俺が代わりに出てくるよ」
という代理人。
TerraformでNAT Gatewayを作る
まず、NAT Gatewayに割り当てるElastic IPを作る。
resource "aws_eip" "nat" {
}
次にNAT Gateway。
resource "aws_nat_gateway" "nat" {
allocation_id = aws_eip.nat.id
subnet_id = aws_subnet.public.id
}
今回はここまで。
一行ずつ理解する
allocation_id
allocation_id = aws_eip.nat.id
これは、
「このNAT Gatewayに、どのElastic IPを割り当てますか?」
という設定。
subnet_id
subnet_id = aws_subnet.public.id
これは、
「NAT GatewayをどのSubnetに配置しますか?」
という設定。
今回はPublic Subnetを指定している。
今日の質問
ここからが今日の本題。
Q1
なぜNAT Gatewayは、
subnet_id = aws_subnet.public.id
なのだろう?
Private Subnetではダメなのか?
理由まで考えてみよう。
Q2
Elastic IPが必要なのはなぜ?
ヒント。
Private SubnetにあるEC2がGoogleなどのインターネット上のサービスへアクセスしたとき、
相手から見て「誰が通信してきたのか」
分からないと困る。
今日の構成図
ここまで学んだ内容をまとめると、だんだんAWSの構成図が見えてくる。
VPC
│
├── Internet Gateway
│
├── Public Route Table
│
├── Public Subnet
│ │
│ ├── ALB
│ │
│ └── NAT Gateway
│
└── Private Subnet
│
├── EC2
│
└── RDS
ここから先は、この構成をTerraformでコードとして表現していく。
自分の回答
Q1
NAT Gatewayはプライベートサブネットがネットワークと接続するために使用するので、パブリックサブネットに置く。プライベートサブネットに置いても通信できない。
Q2
NAT GatewayにElastic IPを固定しないとNAT Gatewayをプライベートサブネットが見つけられないから。
今回のレビュー
Q1:NAT GatewayをPublic Subnetに置く理由
回答:
NAT Gatewayはプライベートサブネットがネットワークと接続するために使用するので、パブリックサブネットに置く。
90点。
かなり良い。
ただし、少しだけ正確にしよう。
NAT Gatewayは、
Public SubnetとPrivate Subnetを直接つなぐ装置
というより、
Private Subnetにあるリソースが、インターネットへアウトバウンド通信するための中継地点
と考える方が正確。
なぜPublic Subnetなのか?
ここが重要。
NAT Gateway自身が、インターネットへ通信できなければならない。
だから、
Private EC2
│
▼
NAT Gateway
│
▼
Internet Gateway
│
▼
Internet
という経路を作る。
NAT GatewayをPublic Subnetに配置することで、
NAT Gateway
│
▼
Public Route Table
│
▼
Internet Gateway
│
▼
Internet
という、外部へ出ていく経路を確保できる。
もしNAT GatewayをPrivate Subnetに置いたら、
Private EC2
│
▼
NAT Gateway
│
▼
???
となる。
代理人であるNAT Gateway自身が外に出られない。
だからPublic Subnetに配置する。
Q2:Elastic IPについて
ここは少し難しかった。
回答:
NAT GatewayにElastic IPを固定しないとNAT Gatewayをプライベートサブネットが見つけられないから。
60点。
惜しい!
Private SubnetがNAT Gatewayを見つけられないわけではない。
Private Route Tableで、
0.0.0.0/0
↓
NAT Gateway
というルートを設定すれば、Private SubnetからNAT Gatewayへ通信できる。
では、Elastic IPは何のために必要なのか?
Elastic IPの役割
ここで、Private EC2のIPアドレスを考える。
例えば、
10.0.2.15
だったとする。
これはプライベートIPアドレス。
このIPアドレスをそのままインターネットへ出しても、
Googleから見れば、
「10.0.2.15って誰?」
となる。
そもそも、
10.0.0.0/8などのプライベートIPはインターネット上でグローバルな通信元アドレスとして利用できない。
そこでNAT Gatewayが登場する。
Private EC2
10.0.2.15
│
▼
NAT Gateway
│
▼
Elastic IP
54.xxx.xxx.xxx
│
▼
Internet
NAT Gatewayが、Private EC2からの通信を外部へ出す際に、送信元をNAT Gateway側のパブリックIPへ変換する。
Googleから見ると、
10.0.2.15
ではなく、
54.xxx.xxx.xxx
から通信が来ているように見える。
つまりElastic IPとは?
一言で言えば、
NAT Gatewayがインターネットと通信するときに使用する固定のパブリックIPアドレス。
これによって、Private EC2のプライベートIPをそのままインターネットへ出すのではなく、
NAT Gatewayを経由して外部と通信できる。
自分の回答を100点にすると
Q1
NAT Gateway自身がインターネットへ出られる必要があるため、Internet Gatewayへ到達できるPublic Subnetに配置する。
Q2
Private SubnetのEC2が持つプライベートIPはインターネット上では利用できないため、NAT GatewayにElastic IPを割り当て、NAT GatewayがそのパブリックIPを使ってインターネットと通信する。
この理解ならOK。
今回の理解度
| 項目 | 評価 |
|---|---|
| NAT Gatewayの役割 | 90点 |
| Public Subnetに配置する理由 | 90点 → 100点 |
| Elastic IPの役割 | 60点 → 100点 |
| NATによるアドレス変換 | これから理解していく |
今回かなり難しかったけど、自分で理由を考えて答えたことが一番重要。
最初から100点の答えを暗記するより、
「ここまでは分かる。でもここから分からない」
という状態を作った方が、理解は深くなる。
ここまでのAWSネットワーク
ここまで来ると、最初に作った構成図がかなり具体的になってきた。
Internet
│
▼
Internet Gateway
│
┌──────────────┴──────────────┐
│ │
Public Route Table Public Subnet
│ │
│ ┌────────┴────────┐
│ │ │
│ ALB NAT Gateway
│ │
│ │
│ Elastic IP
│
│
Private Route Table
│
▼
Private Subnet
│
┌─────┴─────┐
│ │
EC2 RDS
もちろん、まだ完成ではない。
でも、
VPCを作る
↓
Subnetを作る
↓
IGWを作る
↓
Route Tableを作る
↓
SubnetとRoute Tableを関連付ける
↓
NAT Gatewayを作る
と、少しずつAWSの構成図をTerraformへ翻訳できるようになってきた。
今回の学び
今回特に重要なのは、
NAT Gatewayというサービスを覚えたことではない。
Private EC2
↓
Private Route Table
↓
NAT Gateway
↓
Internet Gateway
↓
Internet
という通信経路を理解したこと。
資格勉強では、
- NAT Gateway
- Elastic IP
- Route Table
- Internet Gateway
をそれぞれ覚えていた。
でも実際のAWS環境では、それぞれが単独で動いているわけではない。
複数のAWSサービスがつながって、一つのネットワークを作っている。
そしてTerraformでは、その「つながり」までコードとして表現する。
そして、今回ちょっと面白かったこと
最初は、
「Elastic IPが必要なのは、NAT GatewayをPrivate Subnetから見つけるため?」
と考えていた。
でも、そこから
「あ、Private IPはインターネットでは使えないのか」
と理解できた。
この、
「分からない → 仮説を立てる → 間違える → なぜ違うのか理解する」
という過程こそ、今回の講座で残しておきたい部分。
次回予告
次はいよいよ、
ALB
に進む。
ここから、
Internet
│
▼
ALB
│
▼
Private EC2
という、実際のAWS構成でよく見る形をTerraformで作っていく。
さらに、
「なぜALBはPublic Subnetに置いて、EC2はPrivate Subnetに置くのか?」
という、SAPで学んだ知識とTerraformがまた一つにつながる。
資格勉強で覚えてきた知識を、今度は実際に動くインフラとして組み立てていこう。