ヘヴィメタル・エンジニアリング

AWS特化型エンジニアのほのぼのヘヴィメタルブログ

ヘヴィメタル・エンジニアリング

クラウド特化型ヘヴィメタルエンジニアのほのぼのブログ

AWSのロードバランサー、NLBとALBを比較してみた。

(こちらの記事はCAM Advent Calendar の3日目の記事でもあります。)

 

最近、AWSロードバランサーのNetwork Load Balancer(NLB)にふれる機会があったのでそれについて。

 

Application Load Balamcer(ALB)と比較しながら書いていこうと思います。

 

AWSロードバランサー

 

AWSのElastic Load Balancer(ELB)には以下の3つが存在します。

 

・Classic Load Balancer(CLB)

・Application Load Balamcer(ALB)

・Network Load Balancer(NLB)

 

上記、古い順に並べてみました。

 

CLBとALBに関しては一般的なイメージのもので、requestを受付け、各アベイラビリティーゾーン内のターゲットグループにトラフィックを分散させていくものです。

 

NLBに関してはだいぶ毛色が違います。

 

NLBに移行することでより多量のリクエストに対応できたり、静的IPアドレスが割り当てられ、route53でAレコード*1が使えるため、名前解決*2が早い、などのメリットがあります。

 

以下では両者を比較していきましょう。 

 

通信経路

ALBがクライアントからサーバーへの通信の端を保証するプロキシとしての働きとは変わって、NLBは送信先のIPのみを変換します。

NLBはターゲットとクライアントが直接通信するように見えますが、実際はNLBを経由しています。

 

f:id:xkenshirou:20191126214150p:plain

ALBの通信経路

 

f:id:xkenshirou:20191129130528p:plain

NLBの通信経路

 

下記で詳しく説明します。

 

送信元のアドレスの保持

ALBの場合だとパケットの送信元のIPをロードバランサーのものに置き換えていますが、NLBを用いてインスタンスIDでターゲットを指定すると送信元のIPを保持してくれます。*3

従来だとXFF*4で送信元のIPアドレスをチェックしていましたが、その必要がありません。

セキュリティ的に必要な機能です。 

 

通信手段(リスナーの設定)

ALBはHTTP、HTTPSをサポートしていますが、NLBはTCPTLSUDPTCP_UDPしかしていません。

NLBはUDPも対応していることから、 応答性の良さを優先したい通信や、リアルタイム性が重要視される通信に用いることができます。



セキュリティグループがない

一番大きい点かもしれません。

セキュリティグループとは、インスタンスレベルで設定されるVPC内でのトラフィック制御に用いられるもので、

 

通常はALBのセキュリティグループをターゲットとなるEC2のセキュリティグループのインバウンド*5に設定することで通信を可能にしていましたが、NLBにはセキュリティーグループが存在しないのでこの方法ではできません。

 

f:id:xkenshirou:20191125095208p:plain

ALBでの例

 

これに対する対策としてはVPCのプライベートネットワーク内でEC2のセキュリティグループのインバウンドにIPとして0.0.0.0を指定する方法があります。

 

 

クロスゾーン負荷分散

ALBではクロスゾーン負荷分散はデフォルトで有効化されていますが、NLBではデフォルトで無効化されています。注意。

 

そもそもクロスゾーン負荷分散とは。

従来なら クライアントからのリクエストをロードバランサーアベイラビリティーゾーンと同じ登録済みターゲットに分散させますが、クロスゾーン負荷分散が有効な場合は、ロードバランサーが有効なすべてのアベイラビリティーゾーンの登録済みターゲットに分散させます。

 

f:id:xkenshirou:20191129123207p:plain

クロスゾーン負荷分散が無効の場合

 

 

f:id:xkenshirou:20191129123507p:plain

クロスゾーン負荷分散が有効の場合


上記の図を見てみるとわかるように、クロスゾーン負荷分散が無効の場合は各アベイラビリティーゾーンに50%ずつトラフィックを割り当てたとして、そのアベイラビリティーゾーン内でトラフィックが割り振られているので、ターゲット単位で見るとすべてのターゲットに対して等しくトラフィックは分散されていません。

一方、クロスゾーン負荷分散が有効な場合は、アベイラビリティーゾーンにの枠に捕らわれずに各ターゲットに等しくトラフィックが分散されています。

 

もし片方のアベイラビリティーゾーン内のターゲットが全滅した場合にでも、クロスゾーン負荷分散が有効な場合はLBに来たアクセスはもう片方のアベイラビリティーゾーン内のターゲットに行くため、可用性が高いことがわかります。
 

 

まとめ

一般的な認識のALBとは若干違う部分がNLBには多く、クセがあるように感じました。

設定する際はこちらをよく確認しましょう。

 

 ・ElasticLoadBalancingV2 リソースタイプのリファレンス

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/AWS_ElasticLoadBalancingV2.html

 

 

*1:IPアドレスが直接ドメインと結び付けられたレコードです。

*2:ここではドメイン名からIPアドレスを割り出すこと。

*3:IPアドレスを用いてターゲットを指定する場合はALBと同様に送信元のIPをロードバランサーのものに置き換えます。

*4:X-Forwarded-Forのこと。ロードバランサーを経由してサーバーに接続するなどの際に、送信元のクライアントIPアドレスを特定するHTTPヘッダー。

*5:セキュリティーグループ外から内への通信のこと。