ELBとは
ELBとは複数のアベイラビリティゾーンのEC2インスタンスに負荷を分散させるロードバランサである。ELBには、Classic Load BalancerとApplication Load Balancer、Network Load Balancerの3種類が存在する。特段の理由がなければ、Clasic Load Balancerは使用せず、Application Load Balancer、Network Load Balancerを使用する。
ロードバランサは、登録されているEC2のうち正常なものだけを選んで負荷を分散する。Clasic Load Balancerは、EC2のインスタンスを直接登録するが、Application Load BalancerとNetwork Load Balancerは、ターゲットグループをまず生成し、その中にインスタンスを登録する形となる。クライアントから接続があった場合は、作成したリスナーがそれを確認し、EC2へとトラフィックをルーティングする。EC2にルーティングをクロスゾーン負荷分散を無効にしていると、インスタンスがどのようなバランスで配置されていたとしても、アベイラビリティゾーンの数で均等に配分されてしまうので注意が必要である。なお、Application Load Balancerでは、クロスゾーン負荷分散はデフォルトで有効になっている。
ロードバランサに紐付けられているドメイン名に紐づけられたIPアドレスは、負荷に合わせて動的に変化する。DNSエントリは、TTLが60秒に設定されている。内側のインスタンスとの通信では、EC2にKeep Aliveを設定しておくことが望ましい。
特徴
HTTPS
SSLの終端に対応している。また、同じIPアドレスには1つのドメインしか割り当てられないSSL/TLSを拡張し、複数のドメインに対応したSNIにも対応している。
Application Load Balancer とは
Application Load Balancerは、OSI参照モデルのレイヤー7で動作するロードバランサで、負荷に合わせて自動的にスケールする。HTTP/2やWebSocketに対応している。EC2でクライアントの送信先アドレスを取得するためには、x-forwarded-forヘッダフィールドを参照する。ALBが負荷に追従できずスケーリングが間に合わなかった場合は、503を返す。リクエストタイムアウト値は60秒。
スティッキーセッション
ALB(およびClassic Load Balancer)では、スティッキーセッションを利用できる。ALBは、レスポンスにCookieを含め、 同一のCookieを受信した場合にはリクエストを同じターゲットに送信する。 ターゲットグループ単位 で、スティッキーセッションを有効化できる。
アベイラビリティゾーン
ALBが対象とするアベイラビリティゾーンを有効化/無効化することができる。 無効化されたアベイラビリティゾーンのターゲットは、ALBに登録された状態のままであるが、トラフィックはルーティングされない 。
ルーティング
IPアドレスベースのルーティングに対応しているため、オンプレミス上の任意のサーバをターゲットとして指定することができる。また、Lambdaをターゲットにすることも可能。ホストベース、パスベース、ヘッダーベース、メソッドベースなどのコンテンツベースルーティングにも対応している。
Network Load Balancerとは
Network Load Balancerは、OSI参照モデルのレイヤー4で動作するロードバランサで、必要に応じて1つのElastic IPをサブネットごとに紐づけることができる。また、NLBを作成するときには耐障害性を向上させるために、複数のAZを有効にすることができる。ただし、NLB作成後にAZを有効化したり無効化したりすることはできない。また、割り当てたサブネットに1つ以上のターゲットが存在する必要がある。割り当てたサブネットには最低8個の利用可能なIPアドレスが必要となる。
送信元のIPアドレスを保持することが可能で、Pre-Warmingなしに急激なスパイク(数百万requests/秒)に対応可能。また、NGとなったAZのIPアドレスは自動的にDNSとの紐付けから削除されるなど高い可用性を持つ。
リスナーは、TCP 1-65535ポート、およびWebSocketに対応している。ログは、VPCフローログを利用する。
クロスゾーン負荷分散
NLBでクロスゾーン負荷分散を有効にすると、同一AZ(同一サブネット)のターゲットだけではなく、有効な全てのAZの登録済みのターゲットに対してトラフィックを分散することができる。