プロキシサーバのELB、CLB使うか? NLB使うか?

記事タイトルとURLをコピーする

世の中は選択の連続。

昼ごはん、豚骨ラーメンにするか?醤油豚骨にするか?
夜の居酒屋の一杯目、ビールにするか?ハイボールにするか?
打ち上げ花火、下から見るか? 横から見るか?


そして、

プロキシサーバのELB、CLB使うか? NLB使うか?

はじめに

AWSクラウドデザインパターンのCDP:High Availability NATパターンの中に、「HTTPプロキシーサーバーを内部ELB配下に配置し、プライベートセグメントの各インスタンスは内部ELBをHTTPプロキシーとして使用して、冗長化されたプロキシーサーバー経由でアウトバウンド通信を可能にする。」構成があります。 このデザインパターンが書かれたときのELBは、現在のClassic Load Balancer(CLB)が想定されているものと思われますが、2018年4月現在では、同様の構成をNetwork Load Balancer(NLB)でも実現することができます。以下、それぞれの設定ポイントと採用判断基準をまとめます。

CLBで構成する場合

設定ポイントは以下です。

  • 内部向けロードバランサーとして設定する
  • ロードバランサーのプロトコルはTCPとして設定する
  • プロキシサーバ側で、クライアントの送信元IPアドレスを取得したい場合は、CLBでProxy Protocolを有効に設定します。(プロキシサーバ側も、Proxy Protocolに対応したものである必要があります。)

2点目のプロトコルをTCPにする点について補足します。 CLBのプロトコルをHTTPで設定すると、HTTPリクエスト内のURIを以下のように書き換えてしまい、プロキシサーバ側で接続先の情報を解釈できなくなります。この事象を防ぐため、プロトコルをTCPで設定する必要があります。

クライアントが出したリクエスト例
GET http://www.example.com/index.html HTTP/1.1
CLBが書き換えたリクエスト例
GET /index.html HTTP/1.1

NLBで構成する場合

設定ポイントは以下です。

  • 内部向けロードバランサーとして設定する
  • プロキシサーバ側で、クライアントの送信元IPアドレスを取得する際、ターゲットグループのタイプを「インスタンス」で設定した場合は、追加設定は不要です。(プロキシサーバにパケットが着信する送信元IPアドレスはクライアントのIPアドレスが保持されるため。)
    一方、ターゲットグループを「IP」で設定した場合は、プロキシサーバにパケットが着信する送信元IPアドレスはCLBと同様にロードバランサーのIPアドレスとなるため、Proxy Protocolを有効にする必要があります。

どちらのELBを採用すべきか

一般的にVPCを使用する場合は、CLBではなくNLBを採用することが推奨されていますが、NLBの特性が運用上許容できるかどうかが、採用判断基準になると思われます。

  • NLB自体にセキュリティグループを設定することはできません
  • NLBは、アクセスログが出力できません
  • NLB(内部向け)はVPN経由/VPC Peering経由でアクセスすることができません(Direct Connect経由であれば可能です)

以上、プロキシサーバの前段にELBを配置した構成のポイントとCLB/NLBの採用判断基準についてまとめました。



ちなみに、私、打ち上げ花火、家でハイボール飲みながらテレビで観る派です。ではでは。