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?

第5回 Terraform講座 NAT Gateway

0
Posted at

今回は、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がまた一つにつながる。

資格勉強で覚えてきた知識を、今度は実際に動くインフラとして組み立てていこう。

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?