どーも!shihopowerです。今回はBYOIPでElastic IPアドレスを作成してNATゲートウェイに割り当てたときの通信についてお話しします。
AWS認定 Solutions Architect Professional(SAP)対策をしていると、こんなシナリオの模擬問題に出くわしました。
オンプレミスのWebアプリケーションをAWSに移行したい。このアプリは特定のサードパーティAPIを呼び出しているが、そのAPIは接続元として会社所有の固定のパブリックCIDRブロックしか許可しない。移行後もAPIを呼び出し続けるにはどうすればよいか?
正解の解説を読むと、「顧客所有のパブリックIPアドレスブロックをAWSアカウントに登録し、このブロックからElastic IPアドレスを作成してNATゲートウェイに割り当てる」 とありました。
なんとなく正解とはわかるものの、読み進めるうちにこんな疑問が次々と湧いてきました。
- BYOIPって何?どうやってAWSに登録するの?
- NATゲートウェイにElastic IPを割り当てると、通信はどうなるの?
- ルートテーブルの
nat-gateway-idって、Elastic IPが割り当たっているということ? - BYOIPでEIPを差し替えたら、ルートテーブルも書き換えないといけないの?
これらの疑問をAWS公式ドキュメントをもとに1つずつ解き明かしていきます!
目次
- シナリオを整理する
- BYOIPとは何か
- NATゲートウェイの役割とアドレス変換の仕組み
- 疑問①:ルートテーブルのnat-gateway-idにElastic IPが割り当たっているの?
- 疑問②:プライベートサブネットのDestinationが0.0.0.0/0なのはなぜ?
- 疑問③:BYOIPでEIPを差し替えたらルートテーブルも変更が必要?
- 全体の通信フローまとめ
- まとめ
1. シナリオを整理する
まず問題のシナリオで想定されているAWS構成を整理します。
インターネット
│
▼
┌─────────────────────────────────┐
│ VPC │
│ ┌───────────────────────────┐ │
│ │ パブリックサブネット │ │
│ │ ・ALB │ │
│ │ ・NATゲートウェイ │ │
│ └───────────────────────────┘ │
│ ┌───────────────────────────┐ │
│ │ プライベートサブネット │ │
│ │ ・EC2インスタンス群 │ │
│ └───────────────────────────┘ │
└─────────────────────────────────┘
│
▼
サードパーティAPI(許可リストで接続元CIDRを1つだけ制限)
ポイントはEC2がプライベートサブネットにいることです。プライベートサブネットのEC2は直接インターネットに出られないため、NATゲートウェイを経由してアウトバウンド通信を行います。
このとき、サードパーティAPIへの接続元IPが会社所有の固定CIDRでなければならないというのが制約です。オンプレミスのときは固定のパブリックIPを使っていたので問題なかったわけですが、AWSに移行すると送信元IPがAWSのIPになってしまいます。
これを解決するのが BYOIP(Bring Your Own IP)+ NATゲートウェイ の組み合わせです。
2. BYOIPとは何か
BYOIPとは Bring Your Own IP の略で、オンプレミスで使用していた会社所有のパブリックIPアドレスブロックをそのままAWSに持ち込む機能です。
AWS公式ドキュメントには以下のように記載されています。
オンプレミスネットワークのパブリックルーティング可能なIPv4またはIPv6アドレス範囲の一部または全部をAWSアカウントに持ち込むことができます。アドレス範囲の管理は引き続き自社が行い、AWS経由でインターネットにアドバタイズすることができます。アドレス範囲をAmazon EC2に持ち込むと、AWSアカウント内でアドレスプールとして表示されます。
引用元:Bring your own IP addresses (BYOIP) to Amazon EC2 - AWS公式ドキュメント
BYOIPの主な要件
| 要件 | 内容 |
|---|---|
| RIRへの登録 | ARIN・RIPE・APNICのいずれかに登録されていること |
| 最小CIDRサイズ | IPv4は /24 以上 |
| ROAの作成 | AWSのASN(16509 / 14618)へのアドバタイズを許可するROAを作成する |
| 1リージョンに持ち込める数 | IPv4・IPv6合わせて最大5つ |
| 対応リージョン | 中国リージョンを除くすべての商用リージョン |
BYOIPの登録の流れ
①RIR(ARIN・RIPE・APNICなど)でROAを作成
└── AWSのASN(16509 / 14618)にアドバタイズを許可
②AWSアカウントにCIDRをプロビジョン
└── アドレスプールとしてAWS上に登録される
③プールからElastic IPを作成
└── 会社所有のCIDRブロック内のIPをEIPとして利用可能に
④EIPをNATゲートウェイに割り当て
└── EC2からのアウトバウンド通信の送信元IPが固定される
BYOIPによって作成したElastic IPは、AWSが提供する通常のElastic IPとまったく同じように使えます。つまり、EC2インスタンス・Network Load Balancer・NATゲートウェイなどに割り当てることができます。
3. NATゲートウェイの役割とアドレス変換の仕組み
NATゲートウェイとは
AWS公式ドキュメントでは以下のように定義されています。
NATゲートウェイはNetwork Address Translation(NAT)サービスです。パブリックNATゲートウェイは、プライベートサブネット内のインスタンスがインターネットに接続できるようにしつつ、外部からのインターネット接続開始を防ぎます。パブリックNATゲートウェイはパブリックサブネットに作成し、作成時にElastic IPアドレスを関連付ける必要があります。
アドレス変換の仕組み
公式ドキュメントには以下のように記載されています。
パブリック・プライベートいずれのNATゲートウェイも、インスタンスの送信元プライベートIPv4アドレスをNATゲートウェイのプライベートIPv4アドレスにマッピングします。パブリックNATゲートウェイの場合、さらにインターネットゲートウェイがNATゲートウェイのプライベートIPv4アドレスを、NATゲートウェイに関連付けられたElastic IPアドレスにマッピングします。
つまりアドレス変換は2段階で行われます。
【EC2 → NATゲートウェイ】
EC2のプライベートIP(10.0.1.5)
↓ NATゲートウェイがプライベートIPに変換
NATゲートウェイのプライベートIP
【NATゲートウェイ → インターネットゲートウェイ】
NATゲートウェイのプライベートIP
↓ インターネットゲートウェイがEIPに変換
NATゲートウェイのElastic IP(203.0.113.10)
↓
サードパーティAPI(送信元として203.0.113.10が見える)
BYOIPで作成したEIPをNATゲートウェイに割り当てることで、サードパーティAPIから見たとき、接続元IPが会社所有のCIDR内のアドレスに固定されます。これが今回の解決策の核心です。
4. 疑問①:ルートテーブルのnat-gateway-idにElastic IPが割り当たっているの?
ルートテーブルを見ると、こんな設定があります。
プライベートサブネットのルートテーブル
Destination Target
─────────────────────────────────────
10.0.0.0/16 → local
0.0.0.0/0 → nat-0abc1234def56789(NATゲートウェイのID)
「nat-gateway-idにElastic IPが割り当たっているということ?」と最初は思いましたが、これは誤解です。
ルートテーブルのTargetは 「NATゲートウェイというリソースのID」 を指定しているだけであり、Elastic IPのアドレスは関係ありません。
【ルートテーブル】
0.0.0.0/0 → nat-0abc1234 ← NATゲートウェイのリソースIDを指定しているだけ
↓
【NATゲートウェイ】
nat-0abc1234
└── 割り当てEIP: 203.0.113.10(BYOIPから作成したEIP)
↑
EIPはNATゲートウェイに紐づいているが
ルートテーブルとは別の話
| 要素 | 役割 |
|---|---|
| ルートテーブル | 「宛先0.0.0.0/0のトラフィックをNATゲートウェイに送れ」と経路を指示する |
| NATゲートウェイ | トラフィックを受け取り、送信元IPをEIPに変換して転送する |
| Elastic IP | NATゲートウェイに関連付けられたパブリックIP(外部から見える送信元IP) |
この3つはそれぞれ独立した役割を持っており、ルートテーブルはあくまで「どこに送るか」を決めるだけです。
5. 疑問②:プライベートサブネットのDestinationが0.0.0.0/0なのはなぜ?
「最終的な目的地がインターネットだから0.0.0.0/0になっているの?」と思いましたが、より正確には少し違います。
0.0.0.0/0の正確な意味
0.0.0.0/0 =「VPC内のルートに一致しない、すべての宛先」= デフォルトルート
「インターネット向け」という意味ではなく、「他のどのルートにも当てはまらない場合のデフォルト出口」 です。
ルートの照合優先順位
ルートテーブルは 「より具体的なCIDRが優先」 されます。
プライベートサブネットのルートテーブル
Destination Target
─────────────────────────────────────
10.0.0.0/16 → local ← VPC内通信(最優先・最も具体的)
0.0.0.0/0 → nat-gateway ← 上記に一致しない全て(デフォルト)
実際のトラフィックの例で考えてみます。
例①:EC2が 8.8.8.8(Google DNS)に通信したい場合
① 10.0.0.0/16 に一致する? → NO
② 0.0.0.0/0 に一致する? → YES → NATゲートウェイへ
例②:EC2が 10.0.2.5(同じVPC内の別EC2)に通信したい場合
① 10.0.0.0/16 に一致する? → YES → local(VPC内で直接通信)
② 0.0.0.0/0 は見ない
つまり「インターネットが最終目的地だから0.0.0.0/0」というより、「VPC外への通信のデフォルト出口としてNATゲートウェイを設定している」 という理解が正確です。結果としてインターネット宛のトラフィックがNATゲートウェイへ向かうことになります。
6. 疑問③:BYOIPでEIPを差し替えたらルートテーブルも変更が必要?
結論:ルートテーブルは変更不要です。
BYOIPやEIPの変更はルートテーブルに影響しません。なぜなら、ルートテーブルが指定しているのは 「NATゲートウェイというリソースのID」 であり、「EIPのIPアドレス」ではないからです。
【ルートテーブル側】変更なし
Destination Target
─────────────────────────────────────
10.0.0.0/16 → local
0.0.0.0/0 → nat-gateway-id ← NATゲートウェイのIDのまま
【NATゲートウェイ側】EIPが変わるだけ
NATゲートウェイ(nat-0abc1234)
└── 割り当てEIP: 203.0.113.10(BYOIPから作成したEIP)← ここだけ変わる
設定が必要な箇所を整理すると以下の通りです。
| 設定箇所 | 作業内容 | BYOIPで変わるか |
|---|---|---|
| プライベートサブネットのルートテーブル | 0.0.0.0/0 → nat-gateway-id | 変わらない |
| パブリックサブネットのルートテーブル | 0.0.0.0/0 → internet-gateway-id | 変わらない |
| NATゲートウェイに割り当てるEIP | BYOIPのアドレスプールから作成したEIPを割り当て | ここだけ変わる |
「経路を決めるルートテーブル」と「アドレスを変換するNATゲートウェイ+EIP」はそれぞれ独立した役割を持っており、互いに影響しません。
7. 全体の通信フローまとめ
ここまでの内容を踏まえて、全体の通信フローを整理します。
【BYOIP + NATゲートウェイによる通信フロー】
EC2(プライベートサブネット)
プライベートIP: 10.0.1.5
│
│ ルートテーブル参照
│ 「0.0.0.0/0 → nat-0abc1234(NATゲートウェイ)」
▼
NATゲートウェイ(パブリックサブネット)
・送信元IP変換①:10.0.1.5 → NATゲートウェイのプライベートIP
│
│ ルートテーブル参照
│ 「0.0.0.0/0 → internet-gateway-id」
▼
インターネットゲートウェイ
・送信元IP変換②:NATゲートウェイのプライベートIP → EIP(203.0.113.10)
│
▼
サードパーティAPI
・接続元IPとして「203.0.113.10(会社所有CIDR内のIP)」が見える
・許可リストに登録されたCIDRと一致 → ✅ アクセス許可!
これにより、移行後も会社所有のCIDRブロックからのアクセスとして認識され、サードパーティAPIへの接続が継続できます。
8. まとめ
今回の疑問と気づきを振り返ります。
| 疑問 | 答え |
|---|---|
| ルートテーブルのnat-gateway-idにEIPが割り当たっているの? | NO。ルートテーブルはリソースIDを指定するだけ。EIPはNATゲートウェイに別途関連付けられる |
| 0.0.0.0/0はインターネット向けという意味? | 正確にはVPC外へのデフォルト出口。結果としてインターネット宛トラフィックがNATゲートウェイへ向かう |
| BYOIPでEIPを差し替えたらルートテーブルも変更が必要? | NO。ルートテーブルはNATゲートウェイのIDを指定しているため変更不要 |
SAPの問題を解く際に意識したいのは、「アウトバウンドの送信元IPを固定したいならNATゲートウェイ+EIP」 というパターンです。BYOIPはそこに「会社所有のIPを使いたい」という要件が加わったときの解決策として登場します。
今回の記事がSAP対策の参考になれば嬉しいです!