ネットワーク視点で見るAWS ELB(Elastic Load Balancing)のタイプ別比較[NLB対応]
ども、大瀧です。
本日、新しいELBとしてNLB(Network Load Balancer)がリリースされました。
NLB自体の使い方については大栗の以下の記事をご覧ください。ここでは全部で3種類になったELBをネットワークの視点から区分けしてみたいと思います。
また、機能面の比較はAWS公式の以下のページが詳しいです。
ELBの種類と特徴
現在利用できるELBは以下の3種類で、一般名称と対応付けてみました。
- [NEW!!]Network Load Balancer(以下NLB) : L4 NATロードバランサ
- Application Load Balancer(以下ALB) : L7リバースプロキシ
- Classic Load Balancer(以下CLB) : L4/L7リバースプロキシ
ざっくり言うと、NLBとそれ以外で扱う雰囲気が結構違います。誤解を恐れずに言うと、NLBは従来のELB(ALBやCLB)よりもNAT GatewayやElastic IPなどVPCの機能に分類される、ネットワークコンポーネントに近い印象です。以下、ポイントごとに解説します。
本執筆はターゲットがインスタンスタイプの場合を想定しています。ターゲットがIPタイプの場合やPrivateLink経由では挙動が異なるので注意してください。(執筆当時はIPタイプやPrivateLinkはまだありませんでした)↓の記事が詳しいです。
クライアントとの通信経路が異なる
ALBとCLBはリバースプロキシと書いた通り、行き帰りともにロードバランサを介してクライアントと通信します。一方NLBはトラフィックの宛先IP をターゲットのIPに書き換えて転送するため、帰りはロードバランサを介さず、ターゲットからクライアントに直接通信する形になります。
ロードバランサとしての処理がより少なく済むため、NLBはより低遅延でスケールする仕組みというわけですね(その分、機能はシンプルです)。ちなみにGCPにもNLBがありますが、あちらはDSRで宛先IPを書き換えない方式のため、ターゲット側でトラフィックを受け取るための設定が必要です。ELBのNLBの方がシンプルに対応できる点が異なるかなと思います。
このため、ALBやCLBのターゲットではクライアントまでのネットワーク到達性を意識する必要が無いのに対して、NLBのターゲットはクライアントへのネットワーク到達性を考慮する必要があります。Internet Facingのロードバランサであれば、ターゲットを配置するVPCサブネットのルーティングテーブルにIGWないしNAT Gateway、Internalのロードバランサであればルーティングテーブルにピア接続やVGWを設定することになるでしょう。
2017/09/08 14:00追記 はてブで以下のコメントをいただいたので、検証してみました。
ネットワーク視点で見るAWS ELB(Elastic Load Balancing)のタイプ別比較[NLB対応] | Developers.IO
- [NAT]
- [aws]
DNAT の戻り(reply 時の送信元アドレスの修正)は誰がやってるんだろ
Internet Facing
ターゲットEC2のtcpdump
52.199.129.198
: クライアントのグローバルIP172.31.29.244
: ターゲットEC2のPrivate IP
05:01:56.890661 IP 52.199.129.198.32922 > 172.31.29.244.80: Flags [S], seq 775317263, win 26883, options [mss 1460,sackOK,TS val 263118 ecr 0,nop,wscale 7], length 0 05:01:56.890689 IP 172.31.29.244.80 > 52.199.129.198.32922: Flags [S.], seq 2469781038, ack 775317264, win 26847, options [mss 8961,sackOK,TS val 270916 ecr 263118,nop,wscale 7], length 0 05:01:56.893637 IP 52.199.129.198.32922 > 172.31.29.244.80: Flags [.], ack 1, win 211, options [nop,nop,TS val 263119 ecr 270916], length 0 05:01:56.893685 IP 52.199.129.198.32922 > 172.31.29.244.80: Flags [P.], seq 1:118, ack 1, win 211, options [nop,nop,TS val 263119 ecr 270916], length 117 05:01:56.893697 IP 172.31.29.244.80 > 52.199.129.198.32922: Flags [.], ack 118, win 210, options [nop,nop,TS val 270917 ecr 263119], length 0 05:01:56.893846 IP 172.31.29.244.80 > 52.199.129.198.32922: Flags [.], seq 1:2897, ack 118, win 210, options [nop,nop,TS val 270917 ecr 263119], length 2896 05:01:56.893919 IP 172.31.29.244.80 > 52.199.129.198.32922: Flags [P.], seq 2897:4010, ack 118, win 210, options [nop,nop,TS val 270917 ecr 263119], length 1113 05:01:56.896833 IP 52.199.129.198.32922 > 172.31.29.244.80: Flags [.], ack 4010, win 273, options [nop,nop,TS val 263120 ecr 270917], length 0 05:01:56.896947 IP 52.199.129.198.32922 > 172.31.29.244.80: Flags [F.], seq 118, ack 4010, win 273, options [nop,nop,TS val 263120 ecr 270917], length 0 05:01:56.896961 IP 172.31.29.244.80 > 52.199.129.198.32922: Flags [F.], seq 4010, ack 119, win 210, options [nop,nop,TS val 270918 ecr 263120], length 0 05:01:56.899720 IP 52.199.129.198.32922 > 172.31.29.244.80: Flags [.], ack 4011, win 273, options [nop,nop,TS val 263120 ecr 270918], length 0
クライアントのtcpdump
172.31.4.25
: クライアントのローカルIP13.114.237.119
: NLBのPublic IP
05:01:56.925804 IP 172.31.4.25.32922 > 13.114.237.119.80: Flags [S], seq 775317263, win 26883, options [mss 8961,sackOK,TS val 263118 ecr 0,nop,wscale 7], length 0 05:01:56.928967 IP 13.114.237.119.80 > 172.31.4.25.32922: Flags [S.], seq 2469781038, ack 775317264, win 26847, options [mss 1460,sackOK,TS val 270916 ecr 263118,nop,wscale 7], length 0 05:01:56.928997 IP 172.31.4.25.32922 > 13.114.237.119.80: Flags [.], ack 1, win 211, options [nop,nop,TS val 263119 ecr 270916], length 0 05:01:56.929109 IP 172.31.4.25.32922 > 13.114.237.119.80: Flags [P.], seq 1:118, ack 1, win 211, options [nop,nop,TS val 263119 ecr 270916], length 117 05:01:56.931969 IP 13.114.237.119.80 > 172.31.4.25.32922: Flags [.], ack 118, win 210, options [nop,nop,TS val 270917 ecr 263119], length 0 05:01:56.932223 IP 13.114.237.119.80 > 172.31.4.25.32922: Flags [P.], seq 1:4010, ack 118, win 210, options [nop,nop,TS val 270917 ecr 263119], length 4009 05:01:56.932231 IP 172.31.4.25.32922 > 13.114.237.119.80: Flags [.], ack 4010, win 273, options [nop,nop,TS val 263120 ecr 270917], length 0 05:01:56.932375 IP 172.31.4.25.32922 > 13.114.237.119.80: Flags [F.], seq 118, ack 4010, win 273, options [nop,nop,TS val 263120 ecr 270917], length 0 05:01:56.935151 IP 13.114.237.119.80 > 172.31.4.25.32922: Flags [F.], seq 4010, ack 119, win 210, options [nop,nop,TS val 270918 ecr 263120], length 0 05:01:56.935159 IP 172.31.4.25.32922 > 13.114.237.119.80: Flags [.], ack 4011, win 273, options [nop,nop,TS val 263120 ecr 270918], length 0
Internal
ターゲットEC2のtcpdump
172.31.4.25
: クライアントのローカルIP172.31.29.244
: ターゲットEC2のPrivate IP
05:06:45.495660 IP 172.31.4.25.43918 > 172.31.29.244.80: Flags [S], seq 2299238845, win 26883, options [mss 8961,sackOK,TS val 335260 ecr 0,nop,wscale 7], length 0 05:06:45.495668 IP 172.31.29.244.80 > 172.31.4.25.43918: Flags [S.], seq 1752443261, ack 2299238846, win 26847, options [mss 8961,sackOK,TS val 343067 ecr 335260,nop,wscale 7], length 0 05:06:45.498497 IP 172.31.4.25.43918 > 172.31.29.244.80: Flags [.], ack 1, win 211, options [nop,nop,TS val 335261 ecr 343067], length 0 05:06:45.498550 IP 172.31.4.25.43918 > 172.31.29.244.80: Flags [P.], seq 1:119, ack 1, win 211, options [nop,nop,TS val 335261 ecr 343067], length 118 05:06:45.498557 IP 172.31.29.244.80 > 172.31.4.25.43918: Flags [.], ack 119, win 210, options [nop,nop,TS val 343068 ecr 335261], length 0 05:06:45.498664 IP 172.31.29.244.80 > 172.31.4.25.43918: Flags [P.], seq 1:4010, ack 119, win 210, options [nop,nop,TS val 343068 ecr 335261], length 4009 05:06:45.501558 IP 172.31.4.25.43918 > 172.31.29.244.80: Flags [.], ack 4010, win 350, options [nop,nop,TS val 335262 ecr 343068], length 0 05:06:45.501681 IP 172.31.4.25.43918 > 172.31.29.244.80: Flags [F.], seq 119, ack 4010, win 350, options [nop,nop,TS val 335262 ecr 343068], length 0 05:06:45.501711 IP 172.31.29.244.80 > 172.31.4.25.43918: Flags [F.], seq 4010, ack 120, win 210, options [nop,nop,TS val 343069 ecr 335262], length 0 05:06:45.504498 IP 172.31.4.25.43918 > 172.31.29.244.80: Flags [.], ack 4011, win 350, options [nop,nop,TS val 335263 ecr 343069], length 0
クライアントのtcpdump
172.31.4.25
: クライアントのローカルIP172.31.23.110
: NLBのPrivate IP
05:06:45.494870 IP 172.31.4.25.43918 > 172.31.23.110.80: Flags [S], seq 2299238845, win 26883, options [mss 8961,sackOK,TS val 335260 ecr 0,nop,wscale 7], length 0 05:06:45.497944 IP 172.31.23.110.80 > 172.31.4.25.43918: Flags [S.], seq 1752443261, ack 2299238846, win 26847, options [mss 8961,sackOK,TS val 343067 ecr 335260,nop,wscale 7], length 0 05:06:45.497962 IP 172.31.4.25.43918 > 172.31.23.110.80: Flags [.], ack 1, win 211, options [nop,nop,TS val 335261 ecr 343067], length 0 05:06:45.498068 IP 172.31.4.25.43918 > 172.31.23.110.80: Flags [P.], seq 1:119, ack 1, win 211, options [nop,nop,TS val 335261 ecr 343067], length 118 05:06:45.500786 IP 172.31.23.110.80 > 172.31.4.25.43918: Flags [.], ack 119, win 210, options [nop,nop,TS val 343068 ecr 335261], length 0 05:06:45.500988 IP 172.31.23.110.80 > 172.31.4.25.43918: Flags [P.], seq 1:4010, ack 119, win 210, options [nop,nop,TS val 343068 ecr 335261], length 4009 05:06:45.500998 IP 172.31.4.25.43918 > 172.31.23.110.80: Flags [.], ack 4010, win 350, options [nop,nop,TS val 335262 ecr 343068], length 0 05:06:45.501152 IP 172.31.4.25.43918 > 172.31.23.110.80: Flags [F.], seq 119, ack 4010, win 350, options [nop,nop,TS val 335262 ecr 343068], length 0 05:06:45.503933 IP 172.31.23.110.80 > 172.31.4.25.43918: Flags [F.], seq 4010, ack 120, win 210, options [nop,nop,TS val 343069 ecr 335262], length 0 05:06:45.503943 IP 172.31.4.25.43918 > 172.31.23.110.80: Flags [.], ack 4011, win 350, options [nop,nop,TS val 335263 ecr 343069], length 0
...きっちり経路中の誰かが書き換えてますねw
NLBにはセキュリティグループがない
2023年8月追記 NLBがセキュリティグループをサポートしました。
ALBやCLBにはロードバランサ自身のセキュリティグループ設定があります。これには以下2つのはたらきがあります。
- クライアント→ロードバランサのアクセス制限
- ロードバランサ→ターゲットのアクセス制御
特に2については、セキュリティグループのグループID指定が便利で、ターゲット側で「ロードバランサからのTCP80番のみ許可」という設定が手軽に行えるようになっています。
一方でNLBはセキュリティグループに対応しないため、ロードバランサへのアクセス制限はできません。加えて、「ロードバランサのみ許可」というターゲットでのセキュリティグループ設定もできないため、クライアントからターゲットへの直接アクセスを抑制する手段がありません。 *1
CLBやALBからNLBへの移行を検討するときには、セキュリティグループの設計をやり直すことになるでしょう。
NLBはIPアドレスが固定
ALBおよびCLBはIPアドレスが可変のため、クライアントからのアクセスにはDNS名を利用する必要がありました。DNSで独自ドメインを向けるのであれば、CNAMEレコードないしALIASレコード(Route 53のみ)を設定します。
一方でNLBはIPアドレスの決め打ちはできないものの、一度アサインされたIPアドレスは固定されるので、独自ドメインを向ける先はDNS名とIPアドレスの両方が指定できます。IPアドレスに向けたAレコードが使えるのは、ALBやCLBと比べて柔軟に使えそうですね。
まとめ
NLBが加わって3種類になったELBについて、ネットワーク視点からあれこれとコメントしてみました。それぞれの特徴を踏まえつつ、うまく使い分けていきたいですね。あと、そろそろNLBの詳細なドキュメントの公開を正座待機してます!
参考URL
脚注
- ちなみにトラフィックは送信元IPがクライアントのIPアドレスの状態でターゲットに届くため、ターゲットインスタンス内のOSおよびアプリケーションでも、直接アクセスとロードバランサ経由のアクセスを区別する手段はありません。 ↩