前回は Subnet を作った。
ここまでで、
VPC
└── Subnet
└── EC2
というAWSネットワークの「中身」ができてきた。
でも、ここで一つ問題がある。
このEC2、どうやってインターネットに出る?
今回から、いよいよネットワークの「外側」を作っていく。
今日のテーマ
Internet Gateway
今回も、ただコードを書くわけじゃない。
目標は、
「なぜInternet Gatewayが必要なのか」
を理解すること。
まず質問
Q1
VPCを作っただけで、
Internet
↓
EC2
この通信はできる?
ちょっと考えてみてほしい。
答えは、
できない。
なぜ?
VPCは、簡単に言えばAWS上に作った自分専用のネットワーク。
イメージすると、
マンション
みたいなもの。
マンションを建てただけでは、
マンション
↓
道路
↓
外の世界
とはつながっていない。
だから、VPCの中にEC2を作っただけでは、インターネットへ出るための経路がない。
そこで登場するのが
Internet Gateway
Internet Gateway、略して IGW。
ざっくり言えば、
VPCとインターネットの間をつなぐための出入口
と考えると分かりやすい。
イメージすると、
Internet
↓
Internet Gateway
↓
VPC
マンションで言えば、
IGW=玄関
みたいなもの。
Terraformで作ってみる
コードはこれ。
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main.id
}
今回も一行ずつ見ていく。
resource "aws_internet_gateway"
これは、
Internet GatewayというAWSリソースを作ります
という宣言。
"igw"
これはTerraform上で付ける名前。
aws_internet_gateway.igw
のように、あとからこのIGWを参照するときに使う。
名前なので、igw じゃなくてもいい。
例えば、
resource "aws_internet_gateway" "main"
でもOK。
vpc_id = aws_vpc.main.id
ここは第2回でやったことと同じ。
つまり、
「このInternet Gatewayを、どのVPCに接続するの?」
を指定している。
今回の場合は、
aws_vpc.main
で作ったVPC。
だから、
vpc_id = aws_vpc.main.id
となる。
ここで問題
VPCとIGWを作った。
構成は、
Internet
↓
IGW
↓
VPC
↓
Subnet
↓
EC2
になった。
じゃあ、
これでEC2はインターネットに出られる?
答えは……
まだ出られない。
なぜ?
ここが今回の一番大事なところ。
IGWは、
「出入口」
を作っただけ。
でも、
EC2からIGWまでの道がない。
例えばEC2が、
8.8.8.8
にアクセスしたいとする。
EC2からすると、
「この通信、どこに送ればいいの?」
となる。
IGWは、
「俺は出入口だけど、どの通信を俺に送るかは決めてないよ」
という状態。
つまり、
Internet
↓
IGW
×
EC2
まだ道がつながっていない。
そこで登場するのがRoute Table
ここで、
Route Table
が必要になる。
Route Tableは、ざっくり言えば
「この通信はどこへ送る?」という案内板
例えば、
0.0.0.0/0
↓
IGW
というルートを設定する。
すると、
EC2がインターネットへ通信
↓
Route Tableを見る
↓
「0.0.0.0/0ならIGWだ」
↓
IGWへ送る
という流れができる。
構成を比較してみる
IGWを作っただけだと、
Internet
↓
IGW
Route Table
Subnet
↓
EC2
まだ途中。
Route Tableによって経路を作ると、
Internet
↓
Internet Gateway
↓
Route Table
↓
Subnet
↓
EC2
という形になる。
これで、
「EC2からインターネットへどうやって行くのか」
が見えてきた。
今日の課題
まずは自分でコードを書いてみる。
resource "aws_internet_gateway" "igw" {
vpc_id = aws_vpc.main.id
}
もちろん今回もコピペ禁止。
一文字ずつ書いてみる。
Q1
なぜ、
vpc_id = aws_vpc.main.id
が必要?
第2回のSubnetと同じ考え方で答えてみよう。
Q2
今回の一番大事な問題。
構成が、
Internet
↓
IGW
↓
VPC
↓
Subnet
↓
EC2
なのに、
なぜEC2はまだインターネットへ出られない?
今回の回答
今回のQ1に対する回答は、
どのVPCの中に作るのかを示すため。
これはそのまま正解。
そしてQ2。
CIDRとかいろいろと分けられてるけど、IGWだけじゃどこに転送すればいいかを決められないから。
これが今回かなり良い回答だった。
Q2のレビュー
普通なら、
「Route Tableが必要だから」
で終わるところ。
でも今回の回答は、
「IGWだけじゃどこに転送すればいいかを決められない」
だった。
ここが重要。
Route Tableが必要なのは、
ただ「Route TableというAWSサービスがあるから」ではない。
EC2から見て、
「この通信を次にどこへ送ればいいの?」
という問題を解決するため。
例えばEC2が、
8.8.8.8
へ通信したい。
すると、
EC2
↓
「8.8.8.8ってどこに送ればいい?」
↓
Route Table
↓
「0.0.0.0/0だからIGWへ」
↓
IGW
↓
Internet
となる。
つまりRoute Tableは、
通信の行き先を決める案内板
として働いている。
今回分かったこと
今回の内容を整理すると、
VPC
AWS上に作るネットワーク。
Internet Gateway
VPCとインターネットの出入口。
Route Table
通信をどこへ送るか決める経路情報。
だから、
VPC
│
├── Internet Gateway
│
├── Route Table
│
└── Subnet
│
└── EC2
という構成になっていく。
そしてTerraformでは、
AWSの構成図にある「リソース」と「リソース同士の関係」をコードで表現している。
ここが今回の一番大きなポイント。
次回:Route Table
次回はいよいよ、
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id
}
}
を作る。
そして、
0.0.0.0/0って何?
なぜgateway_idなの?
なぜvpc_idじゃないの?
というところを考える。
ここを理解すると、
EC2
↓
Route Table
↓
Internet Gateway
↓
Internet
という通信経路が、ただの暗記じゃなくて自分の頭の中で説明できるようになる。
第1回でVPCを作り、第2回でSubnetを作り、第3回でInternet Gatewayを追加した。
次回は、その間に**「道」を作る。**