ネットワーク視点で見るAWS ELB(Elastic Load Balancing)のタイプ別比較[NLB対応]

ELB
171件のシェア(すこし話題の記事)

ども、大瀧です。
本日、新しい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の機能に分類される、ネットワークコンポーネントに近い印象です。以下、ポイントごとに解説します。

クライアントとの通信経路が異なる

ALBとCLBはリバースプロキシと書いた通り、行き帰りともにロードバランサを介してクライアントと通信します。一方NLBはトラフィックの宛先IP をターゲットのIPに書き換えて転送するため、帰りはロードバランサを介さず、ターゲットからクライアントに直接通信する形になります。

desc-elb01

ロードバランサとしての処理がより少なく済むため、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


DNAT の戻り(reply 時の送信元アドレスの修正)は誰がやってるんだろ

2017/09/08 13:07

Internet Facing

ターゲットEC2のtcpdump

  • 52.199.129.198 : クライアントのグローバルIP
  • 172.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 : クライアントのローカルIP
  • 13.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 : クライアントのローカルIP
  • 172.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 : クライアントのローカルIP
  • 172.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にはセキュリティグループがない

ALBやCLBにはロードバランサ自身のセキュリティグループ設定があります。これには以下2つのはたらきがあります。

  1. クライアント→ロードバランサのアクセス制限
  2. ロードバランサ→ターゲットのアクセス制御

特に2については、セキュリティグループのグループID指定が便利で、ターゲット側で「ロードバランサからのTCP80番のみ許可」という設定が手軽に行えるようになっています。

一方でNLBはセキュリティグループに対応しないため、ロードバランサへのアクセス制限はできません。加えて、「ロードバランサのみ許可」というターゲットでのセキュリティグループ設定もできないため、クライアントからターゲットへの直接アクセスを抑制する手段がありません*1

desc-elb02

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

脚注

  1. ちなみにトラフィックは送信元IPがクライアントのIPアドレスの状態でターゲットに届くため、ターゲットインスタンス内のOSおよびアプリケーションでも、直接アクセスとロードバランサ経由のアクセスを区別する手段はありません。

AWS Cloud Roadshow 2017 福岡