0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

第4回 Terraform講座 Route Table

0
Posted at

前回までで、

  • 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コンソールだったら、今どの画面を操作している?」

と考えてみる。

今回なら、

  1. VPCを作る
  2. Subnetを作る
  3. Internet Gatewayを作る
  4. Route Tableを作る
  5. Routeを設定する
  6. 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のコードとして実際に理解する。

資格で覚えた知識を、

「知っている」から「自分で構築できる」へ。

次回も進めていこう。🚀

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?