NHN Cloudはロードバランサーを提供しています。ロードバランサーを利用することで、
ロードバランサーは、計3種類のロードバランシング方式をサポートしています。
Round Robin (順次選択):トラフィックを送信するインスタンスを順次選択する、最も基本的で一般的なロードバランシング方式です。全てのメンバーインスタンスが同じリクエストに対して同一のレスポンスを返す場合に使用できる方式です。
Least Connections (最小接続優先選択):現在のTCP接続数が最も少ないインスタンスを選択する方式です。つまり、TCP接続数を基準にしてインスタンスの負荷状況を把握し、メンバーの中で最も負荷が少ないインスタンスに送信することで、可能な限り均等にリクエストが処理されるようにします。リクエストに伴う処理負荷の変動が激しい場合に適用すれば、特定のインスタンスに負荷が集中する状況を防ぐことができます。
Source IP (送信元IP基準選択):リクエスト元の送信元IPをハッシュ化し、処理するインスタンスを選択する方式です。この方式を使用する場合、同一のIPから入るリクエストは常に同じインスタンスに転送されます。あるユーザーのリクエストを毎回同じインスタンスで処理したい場合に使用すると便利です。
ロードバランサーは以下のプロトコルをサポートしています。
上記のプロトコルのうち、TERMINATED_HTTPSプロトコルは、HTTPSトラフィックを受信し、メンバーインスタンスにはHTTPトラフィックとして転送する方式です。TERMINATED_HTTPSプロトコルを使用する場合、エンドユーザーとロードバランサー間ではHTTPSで通信して高いセキュリティを確保し、サーバーにはHTTPトラフィックを渡すことで、復号に必要なCPU負荷を軽減できます。
ポイント
TERMINATED_HTTPSプロトコルを使用するには、証明書と秘密鍵をロードバランサーに登録する必要があります。この時、登録する秘密鍵は必ずパスワードが削除されている必要があります。
SSL/TLSバージョンのいずれかを選択してロードバランサーを作成します。作成されたロードバランサーは、以下のように選択したバージョンと選択したバージョンの上位バージョンのみを使用してクライアントと通信します。
| SSL/TLSバージョンの設定 | ロードバランサーが使用するSSL/TLSバージョン |
|---|---|
| SSLv3 | SSLv3, TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3 |
| TLSv1.0 | TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3 |
| TLSv1.0_2016 | TLSv1.0, TLSv1.1, TLSv1.2, TLSv1.3 |
| TLSv1.1 | TLSv1.1, TLSv1.2, TLSv1.3 |
| TLSv1.2 | TLSv1.2, TLSv1.3 |
| TLSv1.3 | TLSv1.3 |
| SSL/TLSバージョンの設定 | 使用される暗号化スイート | 備考 |
|---|---|---|
| SSLv3 | TLS-AES-128-GCM-SHA256 TLS-AES-256-GCM-SHA384 TLS-CHACHA20-POLY1305-SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-SHA384 ECDHE-RSA-AES256-SHA AES128-GCM-SHA256 AES256-GCM-SHA384 AES128-SHA256 AES256-SHA AES128-SHA DES-CBC3-SHA RC4-MD5 |
|
| TLSv1.0 | TLS-AES-128-GCM-SHA256 TLS-AES-256-GCM-SHA384 TLS-CHACHA20-POLY1305-SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-SHA384 ECDHE-RSA-AES256-SHA AES128-GCM-SHA256 AES256-GCM-SHA384 AES128-SHA256 AES256-SHA AES128-SHA DES-CBC3-SHA |
RC4-MD5 除外 |
| TLSv1.0_2016 | TLS-AES-128-GCM-SHA256 TLS-AES-256-GCM-SHA384 TLS-CHACHA20-POLY1305-SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-SHA384 ECDHE-RSA-AES256-SHA AES128-GCM-SHA256 AES256-GCM-SHA384 AES128-SHA256 AES256-SHA AES128-SHA |
DES-CBC3-SHA 除外 |
| TLSv1.1 | TLS-AES-128-GCM-SHA256 TLS-AES-256-GCM-SHA384 TLS-CHACHA20-POLY1305-SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES128-SHA ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-SHA384 ECDHE-RSA-AES256-SHA AES128-GCM-SHA256 AES256-GCM-SHA384 AES128-SHA256 AES256-SHA AES128-SHA |
同上 |
| TLSv1.2 | TLS-AES-128-GCM-SHA256 TLS-AES-256-GCM-SHA384 TLS-CHACHA20-POLY1305-SHA256 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-SHA384 AES128-GCM-SHA256 AES256-GCM-SHA384 AES128-SHA256 |
ECDHE-RSA-AES128-SHA ECDHE-RSA-AES256-SHA AES256-SHA AES128-SHA 除外 |
| TLSv1.3 | TLS-AES-128-GCM-SHA256 TLS-AES-256-GCM-SHA384 TLS-CHACHA20-POLY1305-SHA256 |
ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES256-SHA384 AES128-GCM-SHA256 AES256-GCM-SHA384 AES128-SHA256 除外 |
標準で提供されるSSL/TLSバージョン別の暗号化スイートの組み合わせに加えて、必要な暗号化スイートのみを直接選んで適用したい場合は、カスタムSSLポリシーを作成してリスナーに接続できます。
SSLポリシーは次の要素で構成されます。
:)で繋げた1つの文字列で指定します。サーバーが名前のプレフィックス(TLS_で始まればTLS 1.3)で自動分類して適用します。少なくとも1つ以上指定する必要があります。注意
TLSv1.3の場合、ciphersにTLS 1.2以下の暗号化スイートを含めることはできません。TLS 1.3ポリシーではTLS 1.2のハンドシェイクが発生せず、TLS 1.2の暗号化スイートが適用されないためです。その他の最小TLSバージョンでは、TLS 1.2以下 / TLS 1.3暗号化スイートを自由に混在させたり、1種類だけを指定したりできます。ポイント
ciphersは、常にTLS 1.2以下の暗号化スイートが先、TLS 1.3暗号化スイートが後にくる順序に正規化されて返却されます。リクエスト時に送信された元の順序は保持されません。ロードバランサーはVPCのサブネット内でIPを自動的に割り当てられて作成するか、IPを指定して作成できます。
ロードバランサーはインスタンスをメンバーとして登録し、流入したトラフィックを分散します。メンバーは2つの方法で登録できます。
ロードバランサーに流入して処理されるトラフィックはリスナーで定義します。リスナーごとにトラフィックを受信するポートとプロトコルを定義し、1つのロードバランサーで多様なトラフィックを処理するように構成できます。一般的に、WebサーバーにはHTTPトラフィックを受信する80ポートのリスナーと、HTTPSトラフィックを受信する443ポートのリスナーを設定して使用します。1つのロードバランサーに複数のリスナーを登録できます。
注意
ロードバランサーで同一の受信ポートを持つリスナーを重複して作成することはできません。
ロードバランサーは、トラフィックを処理する内部エンジンのバージョンとして v1 と v2 の2種類を提供します。エンジンバージョンによって、HTTP トラフィックの処理など一部の動作が異なる場合があります。
| エンジンバージョン | 説明 |
|---|---|
| v2 | 最新のエンジンバージョンです。新規作成するロードバランサーにデフォルトで適用され、HTTP/2 など最新エンジンでのみ提供される機能を使用できます。 |
| v1 | 旧バージョンのエンジンです。既存の動作との互換性が必要な場合に使用します。 |
v2)で作成されます。v1)を維持します。| 機能 | サポート開始バージョン | 説明 |
|---|---|---|
| HTTP/2 プロトコルサポート | v2 | HTTP/1、HTTP/2 バージョンを選択して使用できます。v1 では HTTP/1 のみサポートされます。 |
注意
エンジンバージョンを変更すると、次のように HTTP トラフィック処理の動作が変わる場合があります。運用環境に適用する前に、必ずテストしてください。
v2 は複数のチャンクに分割して送信される HTTP レスポンスを 1 つに統合して処理できます。レスポンスがチャンク単位で届くことを前提に動作するクライアントの場合、動作が変わる可能性があります。v2 はリクエスト・レスポンスの HTTP/1.1 ヘッダー名を小文字に変換して転送する場合があります(例: Content-Type → content-type)。HTTP ヘッダー名は標準上、大文字と小文字を区別しませんが、ヘッダー名の大文字・小文字を区別して処理するバックエンドサーバーやクライアントが存在する場合、動作に影響を与える可能性があります。特にレスポンスヘッダーを読み取るクライアントが影響を受ける場合があります。v2 は HTTP 標準をより厳密に準拠します。非標準形式のリクエスト/レスポンスを使用していた場合、動作が変わる可能性があります。v2 は HTTP 標準(RFC)に準拠していますが、その過程で既存(v1)と比較して一部の動作が若干異なる場合があります。上記の項目は代表的な例であり、明示されていない他の動作も変わる可能性があるため、エンジンバージョンを変更した後は、必ず十分に検証してから運用環境に適用してください。
次のプロトコルを使用する場合、プロトコルバージョンとして HTTP/1 または HTTP/2 を選択できます。
HTTP/2 を選択した場合、メンバーグループで HTTP を選択すると H2C(平文)で、HTTP_REENCRYPT を選択すると H2(TLS 暗号化)で通信します。 選択したプロトコルバージョンに従って厳密に動作し、HTTP/2 を選択した場合は HTTP/1 で通信することはできません。 ヘルスチェックプロトコルを HTTP または HTTPS で選択すると、メンバーグループで選択したプロトコルバージョンと同じように動作します。
注意
NHNLB が自動的に設定されます。ロードバランサーはL7データに基づいてロードバランシングを実行できます。L7ルーティングテンプレートを選択してロードバランサーを作成する場合、L7ポリシーが含まれたロードバランサーを作成できます。 使用可能なアクションは以下のとおりです。
ロードバランサーはプロキシモードで動作します。したがって、クライアントはリクエストを送信するためにロードバランサーと接続を確立し、ロードバランサーはインスタンスサーバーと接続を確立します。メンバーインスタンスサーバーの視点からは、セッションの送信元 (Source) IPがロードバランサーのIPとして認識されます。サーバーでクライアントのIPを確認するには、ロードバランサーが追加したX-Forwarded-Forヘッダの情報を参考にするか (HTTP/TERMINATED_HTTPSプロトコル)、Proxy Protocolを使用する必要があります (TCP/HTTPSプロトコル)。
ポイント
ロードバランサーがプロキシモードで動作する場合、クライアントがリクエストするポートとサーバー側でサービスするポートを異なる形でサービスできます。また、TERMINATED_HTTPSのようにサーバーの負荷を軽減する機能も提供でき、クライアントに送信されるトラフィック量も統計の形で提供できるようになります。(統計機能は追加予定)
ポイント
HTTPの非標準ヘッダとして、サーバーがクライアントのIPを確認するために使用します。 ロードバランサー経由で入るHTTPリクエストにはX-Forwarded-Forキーが含まれます。その値はクライアントのIPです。
X-Forwarded-Forヘッダは、ロードバランサーのプロトコルをHTTP/TERMINATED_HTTPSに設定した場合にのみ有効になります。リスナー単位でX-Forwardedヘッダの追加/削除を制御できます。
ポイント
ロードバランサーでTCPを使用する際、クライアント側のIP情報を送信するためのプロトコルです。人間が理解しやすいようにUS-ASCIIフォーマットの1行のテキストで表現されています。TCP接続が確立されると最初に1回送信され、受信側で全て受信するまで他のデータ送信は遅延します。
プロキシプロトコルは大きく6つの項目に分類されます。それぞれの項目は空白文字で区切られます。 最後の文字は必ずCarrige Return () + Line Feed (\n)で終わる必要があります。
```
PROXY INET_PROTCOL CLIENT_IP PROXY_IP CLIENT_PORT PROXY_PORT\r\n
```
| 略語 | ASCII | HEX | 説明 |
|---|---|---|---|
| PROXY | "PROXY" | 0x50 0x52 0x4F 0x58 0x59 | プロキシプロトコルであることを通知するためのインジケーター |
| INET_PROTOCL | "TCP4"または"TCP6" | 0x54 0x43 0x50 0x34または0x54 0x43 0x50 0x36 | 使用中のINETプロトコル形式 |
| CLIENT_IP | 例) "192.168.100.101" または"fe80::a159:b1f3:c346:5975" |
0xC0 0xA8 0x64 0x65 | 送信元IPアドレス |
| PROXY_IP | 例) "192.168.100.102" または"fe80::a159:b1f3:c346:5976" |
0xC0 0xA8 0x64 0x66 | 宛先IPアドレス |
| CLIENT_PORT | 例) "43179" | 0xA8 0xAB | 送信元ポート |
| PROXY_PORT | 例) "80" | 0x80 | 宛先ポート |
プロキシプロトコルの例は以下のとおりです。
TCPまたはHTTPSプロトコルを使用する場合、ロードバランサーにプロキシプロトコルを設定することでクライアントのIPを確認できます。この場合、サーバーにも上記のようなプロキシプロトコルを認識する機能を備えている必要があります。
リスナーにプロキシプロトコルを設定すると、サービストラフィックには常にプロキシプロトコルが送信されますが、ヘルスチェックトラフィックにはヘルスチェックポートの設定に応じて送信されるかどうかが異なります。ヘルスチェックポートをメンバーポートに設定した場合はヘルスチェックの接続にもプロキシプロトコルが送信され、ユーザー指定で別のポートを指定した場合は送信されません。
| リスナープロキシプロトコル | ヘルスチェックポート | ヘルスチェック時のプロキシプロトコル | サービストラフィックのプロキシプロトコル |
|---|---|---|---|
| ON | メンバーポート | 送信 | 送信 |
| ON | ユーザー指定 | 送信しない | 送信 |
| OFF | メンバーポート | 送信しない | 送信しない |
| OFF | ユーザー指定 | 送信しない | 送信しない |
したがって、ヘルスチェックプロトコルに HTTP または HTTPS を使用しながらプロキシプロトコルが送信される場合、メンバーインスタンスがプロキシプロトコルを認識できる必要があります。認識できる場合に正常なレスポンスが返され、ACTIVE 状態になります。メンバーインスタンスがプロキシプロトコルをサポートしていない場合は、ヘルスチェックポートをユーザー指定に設定してプロキシプロトコルが送信されないようにする必要があります。
ヒント
ヘルスチェックプロトコルが TCP の場合は、メンバーインスタンスとの TCP ハンドシェイクの成否のみを確認します。そのため、プロキシプロトコルの送信有無やメンバーインスタンスのプロキシプロトコルサポートの有無にかかわらず、該当ポートが開いていれば ACTIVE 状態とみなします。
ロードバランサーはQoSを保証するため、リスナーごとに同時に維持できる接続数を制限しています。指定された接続制限値を超過するリクエストが入ってきた場合、ロードバランサー内部のキューに蓄積され、先行するリクエストが完了した後に処理されます。また、キューがいっぱいになるか、サーバー/クライアント側のタイムアウトに達してリクエストが強制的に中断される場合があります。この場合、クライアント側は予期せぬレスポンス遅延を経験する可能性があります。
ポイント
一般ロードバランサーのセッション接続制限の最大値は60,000、専用ロードバランサーの場合は480,000です。
ユーザー情報を維持する必要がある場合や、あるクライアントのリクエストが特定のサーバーにのみ転送される必要があるサービスのために、ロードバランサーのセッション維持機能を利用できます。クライアントのリクエストを処理したサーバーが、継続してそのクライアントのリクエストを処理するようにする設定です。ロードバランシング方式をSOURCE IPに選択した場合、クライアントのIPに基づいてサーバーを決定するため、セッションの維持が提供されます。ロードバランシング方式にROUND ROBINやLEAST CONNECTIONを使用する場合は、次のようなセッション維持機能を使用できます。
No Session Persistence (セッション維持なし):セッション維持を行わない方式です。
Source IP (送信元IPによるセッション管理):リクエスト元の送信元IPを基準にセッションを維持する方式です。このため、最初のリクエスト時にロードバランシング方式によって選択されたインスタンスと送信元IP間のマッピングテーブルを内部的に保管します。その後、同じ送信元IPを持つリクエストが入ってきた場合、マッピングテーブルを確認して最初のリクエストにレスポンスを返したインスタンスに転送します。ロードバランサーは最大10,000個の送信元IPに対するマッピングを保存できます。TCPプロトコルのリスナーでセッションを維持するように設定したい場合は、この方式を使用する必要があります。
APP Cookie (アプリケーションによるセッション管理):サーバー側から提供される明示的なCookie設定を通じてセッションを維持する方式です。最初のリクエスト時、サーバーは自身に設定されたCookie値を設定するように、HTTPのSet-Cookieヘッダを通じて転送する必要があります。この時、ロードバランサーはサーバーのレスポンス中に指定されたCookieがあるか検査し、Cookieがあれば内部的にCookieとサーバーID間のマッピングを維持します。その後、クライアントがCookieヘッダに特定のサーバーを指すCookieを含めて送信すると、ロードバランサーがCookieに対応するサーバーにリクエストを転送します。ロードバランサーでは、CookieとサーバーID間のマッピングが3時間使用されないと自動的に削除されます。
HTTP Cookie (ロードバランサーによるセッション管理):APP Cookie方式と似ていますが、ロードバランサーで自動的に設定されるCookieを通じてセッションを維持する方式です。ロードバランサーはサーバーのレスポンスにSRVというCookieを追加して送信します。この時、SRV Cookieの値はサーバーごとの固有IDです。クライアントがSRVをCookieに含めて送信すると、最初にレスポンスを返したサーバーにリクエストが転送されます。
ポイント
ロードバランサーにTCPセッションの接続維持時間を設定できます。Keep-Aliveタイムアウト値を設定することで、クライアントとロードバランサー、ロードバランサーとサーバー間のセッション維持時間を調整できます。
HTTPリクエストヘッダに無効な文字が含まれている場合にブロックする機能です。サーバーの脆弱性を狙ったハッカーの攻撃や、バグのあるブラウザーを通じて無効な文字が含まれたHTTPリクエストヘッダが流入する可能性があります。この機能が有効化されると、ロードバランサーは無効な文字が含まれたHTTPリクエストをブロックしてインスタンスに送信されるのを防ぎ、400レスポンスコード (bad request) をクライアントに送信します。
ロードバランサーのリスナーで特定のHTTPエラーコードが発生した際に、ユーザーに送信するレスポンスをユーザーが直接定義できます。カスタムレスポンスを設定すると、デフォルトのシステムレスポンスの代わりに、目的のカスタムメッセージやHTMLなどの内容をクライアントに送信できます。
サポートするHTTPステータスコードは400、403、408、500、502、503、504です。レスポンスボディは最大1024文字まで入力でき、コンテンツタイプはtext/html、text/plain、application/json、application/javascript、text/cssの中から選択できます。同一のリスナー内で、各エラーコードは1回のみカスタムレスポンスとして登録できます。
ロードバランサーは、リスナー単位でX-Forwardedヘッダの追加/削除を制御できます。X-Forwardedヘッダは、クライアントのオリジン情報(プロトコル、ポート、IPアドレス)をバックエンドサーバーに送信するために使用されます。
http、TERMINATED_HTTPSリスナーの場合はhttpsの値が設定されます。リスナーの作成時またはリスナーの修正時に、次の3つのフラグを通じて各ヘッダの追加/削除を制御できます。全てのフラグのデフォルト値はtrueです。
enable_x_forwarded_proto:X-Forwarded-Protoヘッダのon/offenable_x_forwarded_port:X-Forwarded-Portヘッダのon/offenable_x_forwarded_for:X-Forwarded-Forヘッダのon/offポイント
X-Forwardedヘッダは、HTTP/TERMINATED_HTTPSプロトコルを使用するリスナーでのみ使用できます。
NHN Cloudのロードバランサーは、メンバーとして登録されたインスタンスが正常に動作しているかを確認するため、定期的にヘルスチェックを試みます。ヘルスチェックは、指定されたプロトコルに従って決められたレスポンスが来るかを確認することで行われます。指定された回数や時間内に正常なレスポンスが来ない場合は、異常なインスタンスとみなして負荷分散の対象から除外します。この機能を通じて、予期せぬ障害やメンテナンスの際にも、中断することなくサービスを提供できます。
ロードバランサーは、ヘルスチェックのプロトコルとしてTCP、HTTP、HTTPSをサポートしています。精密なヘルスチェックを行うため、各プロトコルの使用時にヘルスチェックの方法を多様に設定できます。
リスナーにプロキシプロトコルを設定した場合、ヘルスチェックポートの設定に応じてヘルスチェックの動作が異なります。詳細については、「ロードバランサープロキシモード」の「プロキシプロトコルとヘルスチェック」を参照してください。
ロードバランサーが処理したネットワークフローに関する様々な統計指標をチャートで確認できます。NHN Cloudロードバランサーの統計機能の特徴は以下のとおりです。
提供されるチャートは以下のとおりです。
| 統計指標名 (チャート名) |
区分 | 単位 | 説明 |
|---|---|---|---|
| クライアントセッション数 | クライアント | ea | ロードバランサーがクライアントと接続中のセッション数 |
| クライアントセッションCPS | クライアント | cps (connections per second) |
クライアントと1秒間に新規接続したセッション数 |
| セッションCPS | インスタンス | cps (connections per second) |
インスタンスと1秒間に新規接続したセッション数 |
| トラフィック In | インスタンス | bps (bits per second) |
ロードバランサーがインスタンスに送信したトラフィック量 |
| トラフィック Out | インスタンス | bps (bits per second) |
インスタンスがロードバランサーに送信したトラフィック量 |
| ロードバランシング除外数 | インスタンス | ea | ヘルスチェック(health check)の失敗により、ロードバランシングの対象から除外された回数 |
ポイント
ロードバランサーに流入するパケットを制御するには、IPアクセス制御機能を利用できます。 この機能はセキュリティグループとは異なる機能であり、違いは以下のとおりです。
ポイント
| 区分 | セキュリティグループ | ロードバランサーのIPアクセス制御 | 備考 |
|---|---|---|---|
| 制御対象 | インスタンス | ロードバランサー | |
| 設定対象 | IP、ポートの設定 | IPのみ設定 | ロードバランサーに設定されたポート以外のトラフィックは基本的にブロック |
| 制御トラフィック | インバウンド/アウトバウンドトラフィック 選択可能 |
インバウンドトラフィックのみ制御対象 | |
| アクセス制御タイプ | 許可ポリシーのみ設定 | 許可またはブロックポリシーを選択可能 |
セキュリティグループの設定とロードバランサーのIPアクセス制御設定は、互いに影響を与えません。したがって、インスタンスに送受信されるトラフィックを制御するにはセキュリティグループを使用し、ロードバランサーに流入するトラフィックを制御するにはIPアクセス制御機能を使用する必要があります。
IPアクセス制御機能を利用するには、以下の事項を設定する必要があります。
注意
'「許可」タイプのアクセス制御グループをロードバランサーに適用するには、ロードバランサーのメンバーインスタンスIPをアクセス制御対象に追加する必要があります。
ポイント
NHN Cloud Security Monitoringサービスを利用すると、脅威となる送信元IPアドレスを特定できます。
IPアクセス制御タイプを「ブロック」に設定したIPアクセス制御グループを作成し、発見された脅威送信元IPをアクセス制御対象に追加することで、システムのセキュリティを高めることができます。
ポイント