すべてのプロダクト
Search
ドキュメントセンター

Server Load Balancer:UDP ヘルスチェックによる異常なサーバーのトラブルシューティング

最終更新日:Sep 03, 2026

オンラインゲームやインスタントメッセージングなど、UDP プロトコルを使用するアプリケーションでは、UDP ヘルスチェックを使用します。ヘルスチェックは、UDP パケットを送信してバックエンドサーバーを監視し、異常なサーバーを迅速に検出し、隔離します。

ユースケース

あるオンラインゲーム会社は、UDP プロトコルでプレイヤーのゲームデータを処理する複数のバックエンドサーバーを運用しています。スムーズなゲーム体験を保証するため、同社は各サーバーの状態をリアルタイムで監視したいと考えています。サーバーが異常になった場合、ヘルスチェック機能がサーバーを検出し、隔離できます。これにより、新しいプレイヤーリクエストが異常なサーバーに送信されるのを防ぎます。サーバーが復旧すると、自動的にローテーションに戻され、プレイヤーリクエストの処理を再開します。

同社は、Network Load Balancer (NLB) の UDP ヘルスチェック機能を使用して、各バックエンドサーバーの状態を定期的に確認できます。異常なサーバーが検出されると、NLB はそのサーバーへの新しいリクエストの転送を停止し、サーバーが復旧した後に自動的に転送を再開します。

image

前提条件

  • 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へのサービスのデプロイ

  1. ECS01 インスタンスにログインします。

  2. vi udp_server.py を実行し、i キーを押して編集モードに入ります。

    次のコードをコピーして貼り付けます。

    テストサービスをデプロイするためのサンプルコード

    説明

    4 行目で、UDP_IP の値を ECS01 のプライベート IP アドレスに置き換えます。

    import socket
    # UDP サーバーの IP アドレスとポートを設定します。
    UDP_IP = "10.1.*.*"      # これをバックエンドサーバーのプライベート IP アドレスに置き換えます。
    UDP_PORT = 161            
    # UDP ソケットを作成します。
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
        # ソケットを指定された IP アドレスとポートにバインドします。
        sock.bind((UDP_IP, UDP_PORT))
        print("UDP server up and listening")
        # サーバーを実行し続けます。
        while True:
            # クライアントからデータを受信します (バッファサイズは 1024 バイト)。
            data, addr = sock.recvfrom(1024)
            print(f"Received message: {data} from {addr}")
            # 受信したデータの内容を確認します。
            if data == b"PING":
                sock.sendto(b"PONG1", addr)
                print("Sent PONG1")
    
  3. Esc キーを押し、:wq と入力してファイルを保存します。

  4. sudo python3 udp_server.py コマンドを実行してスクリプトを実行します。

  5. 「UDP server up and listening」 というメッセージが表示されたら、UDP バックエンドサービスは実行中です。

サービスの開始に失敗した場合は、ポートが既に使用されていないかを確認し、コマンドとコードが正しくコピーされていることを確認してください。

ECS02へのサービスのデプロイ

  1. ECS02 インスタンスにログインします。

  2. vi udp_server.py を実行し、i キーを押して編集モードに入ります。

    次のコードをコピーして貼り付けます。

    テストサービスをデプロイするためのサンプルコード

    説明

    4 行目で、UDP_IP の値を ECS02 のプライベート IP アドレスに置き換えます。

    import socket
    # UDP サーバーの IP アドレスとポートを設定します。
    UDP_IP = "10.2.*.*"   # これをバックエンドサーバーのプライベート IP アドレスに置き換えます。
    UDP_PORT = 161        
    # UDP ソケットを作成します。
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as sock:
        # ソケットを指定された IP アドレスとポートにバインドします。
        sock.bind((UDP_IP, UDP_PORT))
        print("UDP server up and listening")
        # サーバーを実行し続けます。
        while True:
            # クライアントからデータを受信します (バッファサイズは 1024 バイト)。
            data, addr = sock.recvfrom(1024)
            print(f"Received message: {data} from {addr}")
            # 受信したデータの内容を確認します。
            if data == b"PING":
                sock.sendto(b"PONG2", addr)
                print("Sent PONG2")
    
  3. Esc キーを押し、:wq と入力してファイルを保存します。

  4. sudo python3 udp_server.py コマンドを実行してスクリプトを実行します。

  5. 「UDP server up and listening」 というメッセージが表示されたら、UDP バックエンドサービスは実行中です。

サービスの開始に失敗した場合は、ポートが既に使用されていないかを確認し、コマンドとコードが正しくコピーされていることを確認してください。

ステップ 2:サーバーグループの作成とヘルスチェックの有効化

  1. NLB コンソールにログインします。

  2. 上部のナビゲーションバーで、NLB インスタンスがデプロイされているリージョンを選択します。

  3. 左側のナビゲーションペインで、NLB > サーバーグループを選択します。

  4. サーバーグループ ページで、サーバーグループの作成 をクリックします。

  5. サーバーグループの作成 ダイアログボックスで、以下のようにパラメーターを設定し、その他はすべてデフォルト値のままにします。詳細については、「サーバーグループ」をご参照ください。

    パラメーター

    説明

    [サーバーグループタイプ]

    サーバータイプ を選択します。

    [バックエンドサーバープロトコル]

    [UDP] を選択します。

    [ヘルスチェックの設定]

    このスイッチをオンにし、ヘルスチェックの設定 の右にある 編集 をクリックします。

    [ヘルスチェックプロトコル]

    [UDP] を選択します。

    [ヘルスチェックポート]

    バックエンドサーバーポート を選択します。

  6. サーバーグループを設定し、作成 をクリックします。サーバーグループの作成後、表示されるダイアログボックスでバックエンドサーバーの追加 をクリックします。

  7. バックエンドサーバーの追加 パネルで、ECS01 と ECS02 を選択し、次へ をクリックします。

  8. [ポートと重みの設定] ウィザードで、ポートに 161 を入力し、重みはデフォルト値のままOK をクリックします。

ステップ 3:UDP リスナーの作成

  1. NLB コンソールにログインします。

  2. 上部のナビゲーションバーで、NLB インスタンスがデプロイされているリージョンを選択します。

  3. インスタンス ページで、対象の NLB インスタンスを見つけ、操作 列のリスナーの作成 をクリックします。

  4. Server Load Balancer を設定 ウィザードで、次の表に記載されているパラメーターを設定します。その他のパラメーターについては、デフォルト値のままにします。詳細については、「UDP リスナーの追加」をご参照ください。設定が完了したら、送信 をクリックします。

    リスナーの設定:

    パラメーター

    説明

    [リスナープロトコルの選択]

    [UDP] を選択します。

    [リスナーポート]

    この例では、161 を入力します。

    サーバーグループの選択:

    パラメーター

    説明

    [サーバーグループ]

    ECS01 と ECS02 が追加されたサーバーグループを選択します。

ステップ 4:テストと検証

  1. 正常なサーバーのプローブ

    1. 同じ VPC 内の任意の Linux クライアントからテストを実行します。

      1. vi udp_client.py を実行し、i キーを押して編集モードに入ります。

        次のコードをコピーして貼り付けます。

        テストと検証のためのサンプルコード

        import socket
        # UDP ソケットを作成します。
        client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        # IP アドレスを NLB インスタンスの仮想 IP (VIP) アドレスに置き換えます。
        server_address = ('10.0.*.*', 161)
        # データを送信します。
        message = "PING"
        client_socket.sendto(message.encode(), server_address)
        # 応答を受信します。
        data, address = client_socket.recvfrom(1024)
        print(f"Received data from server: {data.decode()}")
        # ソケットを閉じます。
        client_socket.close()
        
      2. Esc キーを押し、:wq と入力してファイルを保存します。

    2. sudo python3 udp_client.py コマンドを実行します。PONG1 を含む応答メッセージが返され、ECS01 インスタンスがリクエストを受信できることを示します。

      [root@xxx ~]# python3 udp_client.py
      Received data from server: PONG1
    3. 再度 sudo python3 udp_client.py コマンドを実行します。PONG2 を含む応答メッセージは、ECS02 インスタンスがリクエストを受信できることを示します。

  2. 障害のシミュレーション

    ECS01 インスタンスのバックエンド UDP サービスを停止します。スクリプトが実行されているターミナルで、Ctrl+C を押してスクリプトを終了します。コマンドプロンプトに戻ることで、UDP バックエンドサービスが停止したことを確認できます。

    Linux クライアントに戻り、sudo python3 udp_client.py コマンドを複数回実行します。PONG2 の応答メッセージが表示され、NLB が依然としてリクエストを ECS02 に転送しており、ECS02 が正常にリクエストに応答していることを示します。

  3. NLB コンソールにログインして、ヘルスチェックが失敗した原因を確認します。

    1. インスタンス ページで、対象インスタンスの ID をクリックします。

    2. リスナー タブをクリックします。UDP リスナーのヘルスチェックステータス 列で、ステータスが[異常]になっています。

    3. 異常 をクリックします。ダイアログボックスが表示され、異常なサーバーと障害の原因が表示されます。

      サーバーグループ nlb_udp_sg では、ECS インスタンス udp_server_1 のポート 161 のヘルスチェックが異常です。原因は「Connection interrupted」です。

    4. ダイアログボックスでインスタンスの診断 をクリックします。インスタンスの診断 パネルで、[診断項目の詳細] を表示します。

      [ヘルスチェック診断] の下にある [ヘルスチェックの異常検出] 項目は、深刻度が 「重大」 であることを示しています。説明には「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」と記載されています。

  4. ECS01 で、再度 sudo python3 udp_server.py コマンドを実行してバックエンド UDP サービスを再起動します。「UDP server up and listening」 という出力により、バックエンド UDP サービスが開始されたことを確認できます。

  5. [リスナー] タブに戻り、ヘルスチェックステータスが「正常」になったことを確認します。

ヘルスチェックの無効化

重要

ヘルスチェックを無効にすることはできますが、無効にすると NLB インスタンスは異常なバックエンド ECS インスタンスにリクエストを転送し続け、サービスの中断につながる可能性があります。したがって、絶対に必要な場合を除き、ヘルスチェックの無効化は避けてください。

  1. NLB コンソールにログインします。

  2. 上部のナビゲーションバーで、NLB インスタンスがデプロイされているリージョンを選択します。

  3. 左側のメニューで、NLB > サーバーグループを選択します。

  4. サーバーグループ ページで、対象のサーバーグループを見つけ、操作 列の ヘルスチェック設定の変更 をクリックします。

  5. ヘルスチェック設定の変更 ダイアログボックスで、ヘルスチェックのスイッチをオフにし、保存 をクリックします。

関連ドキュメント

UDP ヘルスチェックの概要と原則の詳細については、「NLB のヘルスチェック」をご参照ください。