見出し画像

【102】【AWS】【Terraform】インターネットゲートウェイとルートテーブルの設定と仕組み

この記事を読むと、インターネットゲートウェイとルートテーブルの設定について理解を深めることができます。
まず、インターネットゲートウェイを設定しましょう。
VPCの作成がルーターやハブなどを用意して環境を整える作業でした。

インターネットゲートウェイ

では、インターネットゲートウェイとは何でしょうか?

インターネットゲートウェイを例えていうと、自分の環境にインターネットの回線を引き込む作業です。
ルーターがあっても、LANケーブル差し込まないとインターネットができませんよね。
インターネットゲートウェイを設定するとは、カチッとルーターにLANケーブルを差し込む作業です。

terraformの設定です。
以前作ったVPC領域と結びつけています。

resource "aws_internet_gateway" "docker_ubuntu" {
 vpc_id = aws_vpc.docker_ubuntu.id
 tags = {
   Name = "terraform_igw_docker_ubuntu"
 }
}

ルートテーブル

次にルートテーブルを設定しましょう。
残念ながらカチッとケーブルを差し込んだだけでは、インターネットはできません。
ネットワークにデータを流すにはルーティング情報が必要だからです。
ルーティング情報のことをAWSではルートテーブルとしています。

インターネットのデータのやり取り
そもそも、インターネット上ではデータをどのようにやり取りしているのでしょうか?
主にインターネットで使われているTCP/IPではデータをパケットとしてやり取りしています。

パケット通信の利点

パケットの利点を簡潔にいうと、送るデータをパケットという小さな単位に分割することによって回線の占有時間が減り、また回線の割り込みが可能であるので、データをスムーズに送れるからです。

パケットについて
パケットはよく宅配物に例えられます。
データの実体を舗装し、ダンボールに入れて、送り状を貼り付けるという形です。
ポイントはデータの実体以外の情報を含んでいる点です。
これをヘッダー情報といいます。
(細かいところまで説明すると木を見て森を見ずという状態になるのでおおまかな理解でお願いします)
パケットはデータの実体以外に様々なヘッダー情報を含んでいます。

宛先IPアドレス
さまざまヘッダー情報の中に宛先IPアドレスがあります。
宅配物でいうと送り状ですね。
ルーターはこの送り状を見て、宛先にもっとも近いネットワークにバケツリレーのような形で転送していきます。
では、もっとも近いネットワークをどのようにしてルーターは把握しているのでしょうか?
ここがポイントです。
宛先IPアドレスが**だったら、ここに流してねと事前にルーターに教えて上げる必要があります。
この作業がルートテーブルを設定するということです。

ルートテーブルの設定

AWSではサブネットごとにルートテーブルを設定できます。
AWS VPCではサブネットとインターネットゲートウェイの間にルーターの役割を果たすソフトウェアが動いています。
AWSはVPC作成するとデフォルトのルート-テーブルが作成されます。

以前作ったVPCのデフォルトルートテーブルでは、

10.0.0.0/16	local

となっています。
これは、宛先10.0.0.0/16が来たら、localに転送してねという意味になります。
localは自分のVPC領域(10.0.0.0/16)ということです。
言い換えると、10.0.0.0/16の範囲外の宛先IPアドレスは全て破棄されます。
これだと外部との通信ができません。
全てのIPアドレスに対して、インターネットゲートウェイに転送してねということをルーターに教えましょう。
全てのIPアドレスは 0.0.0.0/0で表すことができます。
それではTerraformの設定を見ましょう。

resource "aws_route_table" "public" {
 vpc_id = aws_vpc.docker_ubuntu.id
 tags = {
   Name = "docker_ubuntu_route_table_public"
 }
}
resource "aws_route" "public" {
 route_table_id = aws_route_table.public.id
 gateway_id = aws_internet_gateway.docker_ubuntu.id
 destination_cidr_block = "0.0.0.0/0"
}

//サブネットの関連付け
resource "aws_route_table_association" "public" {
 route_table_id = aws_route_table.public.id
 subnet_id = aws_subnet.public.id
}
//サブネット
resource "aws_subnet" "public" {
 cidr_block = "10.0.1.0/24"
 vpc_id = aws_vpc.docker_ubuntu.id
 //  このサブネットで起動したインスタンスに自動的に
 //  IPアドレスを割り当ててくれる
 map_public_ip_on_launch = true
 availability_zone = "ap-northeast-1a"
 tags = {
   Name = "docker_ubuntu_subnet_public_basic_1a"
 }
resource "aws_route_table" "public" {
 vpc_id = aws_vpc.docker_ubuntu.id
 tags = {
   Name = "docker_ubuntu_route_table_public"
 }
}

というルートテーブルに対して、

resource "aws_route" "public" {
 route_table_id = aws_route_table.public.id
 gateway_id = aws_internet_gateway.docker_ubuntu.id
 destination_cidr_block = "0.0.0.0/0"
}

というルールを設定しました。
上記で説明したように、全てのIPアドレスに対して、インターネットゲートウェイに転送するという設定です。

これまでのまとめ

VPCやサブネットの作成、インターネットゲートウェイとルートテーブルの設定しました。
これら一連の作業は、物理的な世界では、ハブやルーターを用意し、LANケーブルを差し込み、ルーターの設定を完了した状態です。

関連記事

参考文献

実践Terraform AWSにおけるシステム設計とベストプラクティス (技術の泉シリーズ(NextPublishing)) オンデマンド (ペーパーバック) 

Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂3版

最後に
私がブログを書く目的は、素晴らしい本や、素晴らしい方々の技術記事を知って頂きたいからです。ぜひ、上記の参考文献を見て下さい。(noteなので広告とかは一切ありません。)

現在、株式会社grabssに行くために最後の悪あがきをしています!!

過去の活動

30日間でブログ記事を100件投稿しました。
トータルの投稿数
この記事は102件目の投稿です。

よろしければ、スキボタン及びサポートお願いします。勉強の励みになります。

この記事が気に入ったらサポートをしてみませんか?