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?

【AWS SAP対策】BYOIPでElastic IPを作成してNATゲートウェイに割り当てたときの通信を理解する

0
Posted at

どーも!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つずつ解き明かしていきます!


目次

  1. シナリオを整理する
  2. BYOIPとは何か
  3. NATゲートウェイの役割とアドレス変換の仕組み
  4. 疑問①:ルートテーブルのnat-gateway-idにElastic IPが割り当たっているの?
  5. 疑問②:プライベートサブネットのDestinationが0.0.0.0/0なのはなぜ?
  6. 疑問③:BYOIPでEIPを差し替えたらルートテーブルも変更が必要?
  7. 全体の通信フローまとめ
  8. まとめ

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 gateways - Amazon Virtual Private Cloud

アドレス変換の仕組み

公式ドキュメントには以下のように記載されています。

パブリック・プライベートいずれのNATゲートウェイも、インスタンスの送信元プライベートIPv4アドレスをNATゲートウェイのプライベートIPv4アドレスにマッピングします。パブリックNATゲートウェイの場合、さらにインターネットゲートウェイがNATゲートウェイのプライベートIPv4アドレスを、NATゲートウェイに関連付けられたElastic IPアドレスにマッピングします。

引用元:NAT gateway use cases - Amazon Virtual Private Cloud

つまりアドレス変換は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対策の参考になれば嬉しいです!


参考

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?