オンラインゲームやインスタントメッセージングなど、UDP プロトコルを使用するアプリケーションでは、UDP ヘルスチェックを使用します。ヘルスチェックは、UDP パケットを送信してバックエンドサーバーを監視し、異常なサーバーを迅速に検出し、隔離します。
ユースケース
あるオンラインゲーム会社は、UDP プロトコルでプレイヤーのゲームデータを処理する複数のバックエンドサーバーを運用しています。スムーズなゲーム体験を保証するため、同社は各サーバーの状態をリアルタイムで監視したいと考えています。サーバーが異常になった場合、ヘルスチェック機能がサーバーを検出し、隔離できます。これにより、新しいプレイヤーリクエストが異常なサーバーに送信されるのを防ぎます。サーバーが復旧すると、自動的にローテーションに戻され、プレイヤーリクエストの処理を再開します。
同社は、Network Load Balancer (NLB) の UDP ヘルスチェック機能を使用して、各バックエンドサーバーの状態を定期的に確認できます。異常なサーバーが検出されると、NLB はそのサーバーへの新しいリクエストの転送を停止し、サーバーが復旧した後に自動的に転送を再開します。
前提条件
-
China (Hangzhou) リージョンに Virtual Private Cloud (VPC) を作成し、2 つの異なるゾーンに 2 つの vSwitch (VSW1 と VSW2) を作成済みであること。詳細については、「VPC の作成と管理」をご参照ください。
-
2 つの ECS インスタンス (ECS01 と ECS02) を作成し、それぞれ VSW1 と VSW2 にデプロイ済みであること。
-
VPC 内に[実行中]な NLB インスタンスがあること。本トピックでは、内部向け NLB インスタンスを例として使用します。詳細については、「NLB インスタンスの作成と管理」をご参照ください。
注意事項
-
TCP または HTTP ヘルスチェックで UDP サービスを監視することも可能ですが、これらの方法では追加の TCP ポートを開く必要があり、ネットワーク構成が複雑になり、セキュリティリスクが生じる可能性があります。Classic Load Balancer (CLB) から NLB に移行する場合は、UDP ヘルスチェックを使用してサービスの一貫性を維持してください。
-
バックエンドサーバーのセキュリティグループが、UDP ヘルスチェックに使用されるポートへのトラフィックを許可していることを確認してください。
操作手順
ステップ 1:サービスのデプロイ
本トピックでは、CentOS 7.9 上の Python スクリプトを使用して、UDP リクエストに応答するサービスをデプロイする方法を説明します。この例は参照用であり、本番環境では使用しないでください。
ECS01へのサービスのデプロイ
-
ECS01 インスタンスにログインします。
-
vi udp_server.pyを実行し、iキーを押して編集モードに入ります。次のコードをコピーして貼り付けます。
-
Escキーを押し、:wqと入力してファイルを保存します。 -
sudo python3 udp_server.pyコマンドを実行してスクリプトを実行します。 -
「
UDP server up and listening」 というメッセージが表示されたら、UDP バックエンドサービスは実行中です。
サービスの開始に失敗した場合は、ポートが既に使用されていないかを確認し、コマンドとコードが正しくコピーされていることを確認してください。
ECS02へのサービスのデプロイ
-
ECS02 インスタンスにログインします。
-
vi udp_server.pyを実行し、iキーを押して編集モードに入ります。次のコードをコピーして貼り付けます。
-
Escキーを押し、:wqと入力してファイルを保存します。 -
sudo python3 udp_server.pyコマンドを実行してスクリプトを実行します。 -
「
UDP server up and listening」 というメッセージが表示されたら、UDP バックエンドサービスは実行中です。
サービスの開始に失敗した場合は、ポートが既に使用されていないかを確認し、コマンドとコードが正しくコピーされていることを確認してください。
ステップ 2:サーバーグループの作成とヘルスチェックの有効化
-
NLB コンソールにログインします。
-
上部のナビゲーションバーで、NLB インスタンスがデプロイされているリージョンを選択します。
-
左側のナビゲーションペインで、を選択します。
-
サーバーグループ ページで、サーバーグループの作成 をクリックします。
-
サーバーグループの作成 ダイアログボックスで、以下のようにパラメーターを設定し、その他はすべてデフォルト値のままにします。詳細については、「サーバーグループ」をご参照ください。
パラメーター
説明
[サーバーグループタイプ]
サーバータイプ を選択します。
[バックエンドサーバープロトコル]
[UDP] を選択します。
[ヘルスチェックの設定]
このスイッチをオンにし、ヘルスチェックの設定 の右にある 編集 をクリックします。
[ヘルスチェックプロトコル]
[UDP] を選択します。
[ヘルスチェックポート]
バックエンドサーバーポート を選択します。
-
サーバーグループを設定し、作成 をクリックします。サーバーグループの作成後、表示されるダイアログボックスでバックエンドサーバーの追加 をクリックします。
-
バックエンドサーバーの追加 パネルで、ECS01 と ECS02 を選択し、次へ をクリックします。
-
[ポートと重みの設定] ウィザードで、ポートに
161を入力し、重みはデフォルト値のままOK をクリックします。
ステップ 3:UDP リスナーの作成
-
NLB コンソールにログインします。
-
上部のナビゲーションバーで、NLB インスタンスがデプロイされているリージョンを選択します。
-
インスタンス ページで、対象の NLB インスタンスを見つけ、操作 列のリスナーの作成 をクリックします。
-
Server Load Balancer を設定 ウィザードで、次の表に記載されているパラメーターを設定します。その他のパラメーターについては、デフォルト値のままにします。詳細については、「UDP リスナーの追加」をご参照ください。設定が完了したら、送信 をクリックします。
リスナーの設定:
パラメーター
説明
[リスナープロトコルの選択]
[UDP] を選択します。
[リスナーポート]
この例では、
161を入力します。サーバーグループの選択:
パラメーター
説明
[サーバーグループ]
ECS01 と ECS02 が追加されたサーバーグループを選択します。
ステップ 4:テストと検証
-
正常なサーバーのプローブ
-
同じ VPC 内の任意の Linux クライアントからテストを実行します。
-
vi udp_client.pyを実行し、iキーを押して編集モードに入ります。次のコードをコピーして貼り付けます。
-
Escキーを押し、:wqと入力してファイルを保存します。
-
-
sudo python3 udp_client.pyコマンドを実行します。PONG1を含む応答メッセージが返され、ECS01 インスタンスがリクエストを受信できることを示します。[root@xxx ~]# python3 udp_client.py Received data from server: PONG1 -
再度
sudo python3 udp_client.pyコマンドを実行します。PONG2を含む応答メッセージは、ECS02 インスタンスがリクエストを受信できることを示します。
-
-
障害のシミュレーション
ECS01 インスタンスのバックエンド UDP サービスを停止します。スクリプトが実行されているターミナルで、Ctrl+C を押してスクリプトを終了します。コマンドプロンプトに戻ることで、UDP バックエンドサービスが停止したことを確認できます。
Linux クライアントに戻り、
sudo python3 udp_client.pyコマンドを複数回実行します。PONG2の応答メッセージが表示され、NLB が依然としてリクエストを ECS02 に転送しており、ECS02 が正常にリクエストに応答していることを示します。 -
NLB コンソールにログインして、ヘルスチェックが失敗した原因を確認します。
-
インスタンス ページで、対象インスタンスの ID をクリックします。
-
リスナー タブをクリックします。UDP リスナーのヘルスチェックステータス 列で、ステータスが[異常]になっています。
-
異常 をクリックします。ダイアログボックスが表示され、異常なサーバーと障害の原因が表示されます。
サーバーグループ nlb_udp_sg では、ECS インスタンス udp_server_1 のポート 161 のヘルスチェックが異常です。原因は「Connection interrupted」です。
-
ダイアログボックスでインスタンスの診断 をクリックします。インスタンスの診断 パネルで、[診断項目の詳細] を表示します。
[ヘルスチェック診断] の下にある [ヘルスチェックの異常検出] 項目は、深刻度が 「重大」 であることを示しています。説明には「the health check detected an anomaly」と記載されており、異常なバックエンドサーバーのトラブルシューティングを行い、[Further Diagnostics] を使用してリアルタイムプローブを開始することを推奨します。表には、リスナー ID が
nlb-InstanceID@udp-161であり、サーバーポートとヘルスチェックポートの両方が 161、プライベート IP が 172.16.100.120 であることが表示されています。診断結果には、「Further diagnostics are supported only for Linux operating systems」と記載されています。
-
-
ECS01 で、再度
sudo python3 udp_server.pyコマンドを実行してバックエンド UDP サービスを再起動します。「UDP server up and listening」 という出力により、バックエンド UDP サービスが開始されたことを確認できます。 -
[リスナー] タブに戻り、ヘルスチェックステータスが「正常」になったことを確認します。
ヘルスチェックの無効化
ヘルスチェックを無効にすることはできますが、無効にすると NLB インスタンスは異常なバックエンド ECS インスタンスにリクエストを転送し続け、サービスの中断につながる可能性があります。したがって、絶対に必要な場合を除き、ヘルスチェックの無効化は避けてください。
-
NLB コンソールにログインします。
-
上部のナビゲーションバーで、NLB インスタンスがデプロイされているリージョンを選択します。
-
左側のメニューで、NLB > サーバーグループを選択します。
-
サーバーグループ ページで、対象のサーバーグループを見つけ、操作 列の ヘルスチェック設定の変更 をクリックします。
-
ヘルスチェック設定の変更 ダイアログボックスで、ヘルスチェックのスイッチをオフにし、保存 をクリックします。
関連ドキュメント
UDP ヘルスチェックの概要と原則の詳細については、「NLB のヘルスチェック」をご参照ください。