前回までで、
- VPC
- Subnet
- Internet Gateway
を作ってきた。
ここまでで、
Internet
│
▼
Internet Gateway
│
▼
VPC
│
▼
Subnet
│
▼
EC2
という構成ができている。
でも、これだけではEC2はインターネットへ出られない。
なぜだろう?
前回の最後に出てきた答えは、
IGWがあるだけでは、どこへ通信を転送するのか決められないから。
だった。
そこで今回登場するのが、
Route Table
まずAWSコンソールを思い出す
AWSでRoute Tableを作るとき、最初に何を選ぶ?
そう。
どのVPCに作るのか。
だからTerraformでは、
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
}
となる。
ここまでは、これまでと同じ。
つまり、
Route Table
│
▼
VPC
という所属関係を作っている。
次に「Route」を設定する
Route Tableの中に、
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id
}
と書く。
今回のポイントは、この2つ。
cidr_block = "0.0.0.0/0"
と、
gateway_id = aws_internet_gateway.igw.id
まず 0.0.0.0/0 とは?
これはSAPの勉強でも何度も出てきたと思う。
では質問。
cidr_block = "0.0.0.0/0"
これは何を意味している?
自分の回答
「すべての通信を受け付ける」
今回のレビュー
惜しい。85点。
「すべて」という感覚は合っている。
ただし、ここで重要なのは、
「すべての通信」ではなく「すべての宛先」
ということ。
0.0.0.0/0 は、
「どの宛先にも一致する」
という意味。
例えば、
8.8.8.8
1.1.1.1
203.0.113.10
など、どのIPアドレス宛ての通信でも対象になる。
つまり、
宛先がどこであっても
↓
0.0.0.0/0
↓
このRouteを使う
という考え方。
Route Tableは「案内板」
ここでRoute Tableを、道路の案内板だと考えてみる。
例えば、
目的地 行き先
すべての宛先 ──────→ Internet Gateway
という案内板がある。
Terraformでは、
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id
}
と書く。
日本語にすると、
「すべての宛先への通信は、Internet Gatewayへ送ってください。」
という意味になる。
この一文を理解できると、Route Tableの役割がかなり見えてくる。
次の疑問
では、
gateway_id = aws_internet_gateway.igw.id
は何をしているのだろう?
そして、
なぜ gateway_id なのか?
なぜ vpc_id ではないのか?
自分の回答
IGWにこの設定を適用させたいから。
そして、
VPCに
cidr_block = "0.0.0.0/0"を設定したいのではなく、IGWにcidr_block = "0.0.0.0/0"を適用するため。
今回のレビュー
ここは90点。
考え方として、
「gateway_id がIGWに関係している」
ところまでは見えている。
ただし、1つ大きな修正がある。
gateway_id はIGWを設定しているわけではない
ここが今回の重要ポイント。
gateway_id = aws_internet_gateway.igw.id
は、
「IGWに設定を適用する」
という意味ではない。
Route Tableに、
「この宛先への通信は、このGatewayへ送ってください」
と書いている。
つまり、
Route Table
0.0.0.0/0
│
▼
Internet Gateway
という経路を定義している。
だから gateway_id になる
Route Tableは、
「どこへ行くの?」
を案内するもの。
例えば、
東京駅
│
▼
新宿駅
という案内板があったとする。
このとき、
「東京駅」という場所を設定するのではなく、
目的地である新宿駅
を指定する。
AWSでも同じ。
cidr_block = "0.0.0.0/0"
↓
どの宛先?
すべての宛先
↓
どこへ送る?
gateway_id = aws_internet_gateway.igw.id
↓
Internet Gatewayへ送る。
という関係になっている。
Route Tableを日本語にすると
このコード、
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.igw.id
}
を日本語にすると、
「すべての宛先への通信は、Internet Gatewayへ送ってください。」
になる。
これが今回、一番覚えておきたい文章。
でも、まだ完成ではない
ここまで作ると、
Internet
│
▼
Internet Gateway
│
▼
Route Table
│
?
│
▼
Subnet
│
▼
EC2
となる。
ここで問題。
Route TableとSubnetは、まだつながっていない。
Route Tableを作っただけでは、
「このSubnetは、このRoute Tableを使います」
という指定がない。
そこで登場するのがRoute Table Association
Terraformでは、
resource "aws_route_table_association" "public" {
subnet_id = aws_subnet.public.id
route_table_id = aws_route_table.public.id
}
のように、
SubnetとRoute Tableを関連付ける。
つまり、
Route Table
│
│ Association
▼
Public Subnet
│
▼
EC2
という関係を作る。
ここで今日の最重要問題
もし、
resource "aws_route_table_association"
を書かなかったら、
EC2はインターネットへ出られると思う?
理由も自分の言葉で考えてみよう。
自分の回答
aws_route_table_associationでルートテーブルとサブネットを繋げるから、これがなかったらEC2はネットワークに接続できない!
今回のレビュー
90点。
かなり惜しい。
重要なのは、
「EC2がネットワークに接続できない」わけではない
ということ。
EC2はSubnetの中に配置されているので、VPC内のネットワークには存在している。
問題は、
インターネットへ出るための経路を使えない
こと。
正確にはこう
Route Tableは存在する。
Internet Gatewayも存在する。
しかし、
Route Table
│
×
│
Subnet
となっていて、
「このSubnetは、このRoute Tableを使う」
という関連付けがない。
そのため、
EC2
│
▼
Subnet
│
▼
???
となる。
EC2が、
「インターネットへ行きたい!」
となっても、
どのRoute Tableを使えばいいのか決まっていない。
だからインターネットへ出られない。
完成するとこうなる
Internet
│
▼
Internet Gateway
│
▼
Route Table
│
│ Route Table Association
▼
Public Subnet
│
▼
EC2
これで、
EC2 → Subnet → Route Table → IGW → Internet
という経路が完成する。
今回の重要ポイント
今回の学習で重要なのは、Terraformのコードを覚えることではない。
AWSの構成を、
「どのリソースとどのリソースが、どうつながっているのか」
として理解すること。
例えば、
VPC
│
├── Subnet
│
├── Internet Gateway
│
└── Route Table
│
└── Association
│
▼
Subnet
Terraformでは、この見えない関係性までコードで表現する。
Terraformは「AWSコンソールのコード化」
ここで一つ、今後の学習で意識したいこと。
Terraformでコードを書くとき、
「AWSコンソールだったら、今どの画面を操作している?」
と考えてみる。
今回なら、
- VPCを作る
- Subnetを作る
- Internet Gatewayを作る
- Route Tableを作る
- Routeを設定する
- Route TableとSubnetを関連付ける
という操作を、Terraformでコードにしている。
だからTerraformは、
「謎の新しいプログラミング言語」
ではない。
「AWSで行っていた構築作業をコードとして表現している」
と考えると、一気に分かりやすくなる。
今回の学習でつながった知識
ここまでで、
- VPC
- CIDR
- Subnet
- AZ
- Internet Gateway
- Route Table
- Route
- Route Table Association
がつながった。
そして、
VPC
│
▼
Subnet
│
▼
Route Table
│
▼
Internet Gateway
│
▼
Internet
というネットワークの経路を、Terraformで表現できるようになってきた。
そして、ここが今回一番伝えたいこと
SAPの勉強をしていた頃は、
「Route Tableって何だろう」
と、サービス単位で覚えていた。
でもTerraformを書き始めると、
「Route TableはSubnetとどうつながっている?」
「この通信はどこへ転送される?」
「なぜIGWを指定する?」
と考えるようになる。
つまり、
資格勉強で覚えてきた知識が、実際の構成としてつながり始めている。
これが今回の一番大きな収穫だった。
次回
次はいよいよ、
NAT Gateway
Private EC2
│
▼
Private Route Table
│
▼
NAT Gateway
│
▼
Internet Gateway
│
▼
Internet
を作っていく。
ここでは、
「Private Subnetなのに、なぜインターネットへ出られるの?」
という、SAPでも頻出だった仕組みを、今度はTerraformのコードとして実際に理解する。
資格で覚えた知識を、
「知っている」から「自分で構築できる」へ。
次回も進めていこう。🚀