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

Function Compute:WebSocket リクエストに応答する関数の HTTP トリガーを構成する

最終更新日:Mar 12, 2025

Function Compute では、WebSocket リクエストに応答するように関数の HTTP トリガーを構成できます。関数の HTTP トリガーを構成すると、関数は Web サーバーとして機能して WebSocket リクエストを処理し、呼び出し元にレスポンスを返します。

始める前に

サービスを作成する

手順 1: 関数を作成する

  1. Function Compute コンソール にログインします。左側のナビゲーションウィンドウで、[サービスと関数] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。[サービス] ページで、目的のサービスをクリックします。

  3. [関数] ページで、[関数の作成] をクリックします。
  4. [関数の作成] ページで、カスタムランタイムの使用 を選択し、パラメーターを構成して、[作成] をクリックします。

    以下の項目では、構成する必要があるパラメーターについて説明します。リストされていないその他のパラメーターについては、デフォルト値を保持します。詳細については、「関数の作成」をご参照ください。

    • 関数名: 関数名を入力します。例: websocket-demo

    • ハンドラータイプ: HTTP ハンドラー を選択します。

    • ランタイム: ドロップダウンリストから Node.js 18 を選択します。

手順 2: コードを記述してデプロイする

  1. 関数の詳細ページで、[コード] タブをクリックし、コードエディターに関数コードを入力します。

    Function Compute コンソールの WebIDE のカレントディレクトリで、次のコードを index.js ファイルにコピーします。サンプルコード:

    const WebSocket = require('ws');
    
    const WebSocketServer = WebSocket.Server;
    
    const wss = new WebSocketServer({
      host: "0.0.0.0",
      port: 9000,
    });
    
    wss.on('connection', function (ws, req) {
      console.log(`[SERVER] connection()`);
      ws.on('message', function (message) {
        ws.send(`${message}`, (err) => {
          if (err) {
            console.log(`[SERVER] error: ${err}`);
          }
        });
      })
    });
    説明
    • WebSocket サーバーが listen する IP アドレスは 0.0.0.0 で、これは使用可能なすべてのネットワークポートを示します。IP アドレスとして 127.0.0.1 または localhost を指定しないでください。

    • WebSocket サーバーが listen するポート番号は、0 ~ 65535 の整数です。ほとんどの場合、ポート番号は 1024 より大きくなります。port パラメーターは、関数に指定した値に設定する必要があります。デフォルト値は 9000 です。

    次の図は、WebIDE のディレクトリ構造を示しています。directory1

  2. WebIDE ターミナルで、npm install ws コマンドを実行して依存関係をインストールします。 Python ランタイムに依存関係をインストールする方法については、「Function Compute コンソールを使用して依存関係をインストールする」をご参照ください。

    依存関係がインストールされると、package-lock.json ファイルが自動的に生成されます。次の図は、ディレクトリ構造を示しています。dir2

  3. [デプロイ] をクリックして、Function Compute にコードをデプロイします。

手順 3: 関数をテストする

  1. 関数の詳細ページで、[トリガー] タブをクリックして、トリガーのパブリックエンドポイントを表示してコピーします。

    image.png

    説明

    HTTP トリガーが作成されると、パブリックエンドポイントは変更されません。

  2. Postman を使用して関数をテストします。 詳細については、「Postman」をご参照ください。

    1. Postman で WebSocket リクエストを作成します。

      パブリックエンドポイントを Postman にコピーし、スキームパラメーターの値を HTTPS から WebSocket Secure (WSS) に変更します。

    2. ビジネス要件に基づいてパラメーターとヘッダーを構成します。

    3. WebSocket に接続します。接続が確立されたら、メッセージを送信できます。

    4. 送信するメッセージを入力し、関数がメッセージを受信するかどうかを確認します。

    5. 実行タイムアウト期間が経過すると、WebSocket への接続は終了します。

    次の図は、テストプロセスを示しています。

    image.png

    (オプション) Postman を使用して HTTP トリガーをテストするときに FCCommonError が発生した場合は、HTTP トリガーの認証方式を確認してください。アクセスを認証する必要がない場合は、テストを実行する前に、HTTP トリガーの認証方式を [認証なし] に設定できます。

    image

詳細情報

リクエストタイムアウト

Function Compute は、実行タイムアウト期間に関して WebSocket リクエストと HTTP リクエストを区別しません。WebSocket 接続が指定されたタイムアウト期間よりも長く続くと、WebSocket 接続は強制的に終了し、クライアントはステータスコード 1006 を受信します。

キープアライブモードとタイムアウト時の再接続

WebSocket 接続が確立されると、接続期間が指定されたタイムアウト期間を超えない限り、接続は維持され、Function Compute は既存のロジックを中断しません。WebSocket 接続が有効なときに一定期間データが転送されない場合、クライアントの内部 IP アドレスをパブリック IP アドレスにマッピングする NAT ゲートウェイやルート構成などの中間ノードによって接続が無効になる可能性があります。この場合、接続タイムアウト期間は固定されません。タイムアウト期間内にデータが転送されない場合、NAT ゲートウェイは WebSocket 接続を切断する可能性があります。WebSocket プロトコルで提供される ping フレームと pong フレームを使用して、接続を維持するか、WebSocket 接続が使用可能かどうかを確認する必要がある場合があります。

Function Compute が提供する最大タイムアウト期間を超える長いタイムアウト期間が必要な場合、または実行中のアプリケーションの安定したロジックを維持する場合は、クライアントコードに再接続メカニズムを追加してタイムアウトを処理します。Reconnecting-WebSocket ライブラリまたは SocketIO ライブラリを使用して、上記のメカニズムを実装できます。

セッションアフィニティ

Function Compute はステートレスです。関数が同時に多数の同時リクエストを受信する場合、Function Compute は同じクライアントからのリクエストが同じコンテナーによって処理されることを保証できません。Redis、Memcached、Apache Kafka、データベースなどの外部ストレージサービスを使用して、複数のコンテナーインスタンス間で WebSocket リクエストの状態を維持する必要がある場合があります。

たとえば、チャットルームアプリケーションの場合、Function Compute はすべてのユーザーが同時に同じ関数インスタンスに接続されていることを保証できません。この場合、Redis の Pub/Sub 機能を使用してチャットルームアプリケーションを構成できます。ユーザーがチャットルームに参加すると、チャットルームが属するチャンネルにサブスクライブ (Sub) します。ユーザー 1 が関数にメッセージを送信すると、関数は Redis 内のチャットルームが属するチャンネルにメッセージをパブリッシュ (Pub) します。これにより、チャットルーム内のすべてのユーザーがメッセージを受信できます。

課金方法

WebSocket リクエストと HTTP リクエストの課金方法は同じです。WebSocket リクエストは、接続時間が長い HTTP リクエストと見なすことができます。課金の詳細については、「課金の概要」をご参照ください。

  • インスタンスの同時実行数が 1 である関数の場合、課金は WebSocket 接続が確立されたときに開始し、WebSocket 接続が終了したときに終了します。

  • インスタンスの同時実行数が 1 より大きい関数の場合、課金は最初の WebSocket 接続が確立されたときに開始し、最後の WebSocket 接続が終了したときに終了します。一定期間内に複数の接続が存在する場合、システムは課金を 1 回だけ実行します。

    次の図では、関数のインスタンスの同時実行数は 2 です。最初のリクエストは T1 に到着し、T3 に終了します。2 番目のリクエストは T2 に到着し、T4 に終了します。課金は T1 から開始し、T4 に終了します。T2 から T3 までは、料金は 1 回だけ請求されます。websocket-billing

カスタムランタイム

カスタムコンテナーランタイム

Python

Python

Node.js

Node.js

Golang

Golang

FAQ

WebSocket 関数を実行できないのはなぜですか?

  • 新しいトリガーのキャッシュを更新するために必要な時間は約 10 秒です。数秒待ってからもう一度試してください。

  • 関数コード内の依存関係が正しくインストールされているかどうかを確認します。詳細については、「関数のサードパーティの依存関係をインストールする」をご参照ください。

  • 関数が listen するポートと IP アドレスが正しいかどうかを確認します。関数が listen する IP アドレスは 0.0.0.0 にできますが、127.0.0.1 または localhost にはできません。カスタムリスニングポートを指定しない場合は、ポート 9000 が使用されます。

トラブルシューティング

WebSocket ハンドシェイクが完了する前に、次のエラーが発生する可能性があります。

  • リクエストエラー: 特定の条件に一致しないリクエストが送信されると、リクエストエラーが発生します。リクエストエラーが発生した場合、レスポンスで HTTP ステータスコード 4xx が返されます。

  • 関数エラー: 関数コードが無効な場合、関数エラーが発生します。関数エラーが発生した場合、HTTP ステータスコード 5xx が返されます。

エラータイプ

X-Fc-Error-Type

HTTP ステータスコード

原因

課金対象

リクエストエラー

FcCommonError

400

リクエストがリクエストの制限を超えています。詳細については、「概要」をご参照ください。

いいえ

FcCommonError

400

身分認証を必要とする関数へのリクエストに、日付または認証情報が含まれていません。

いいえ

FcCommonError

403

身分認証を必要とする関数へのリクエストの署名が無効です。これは、認証情報が無効であることを示します。日付は署名の計算に使用され、15 分間のみ有効です。アクセス認証を必要とする HTTP トリガーを使用する場合、リクエストヘッダーの日付情報が現在の時刻より 15 分を超えていると、署名が無効になります。

いいえ

FcCommonError

403

リクエストで、HTTP トリガーに構成されていないリクエストメソッドが使用されています。WebSocket 関数の場合、HTTP トリガーは GET メソッドをサポートする必要があります。GET メソッドが構成されていない場合、エラーが報告されます。

いいえ

FcCommonError

404

WebSocket リクエストが、HTTP トリガーが構成されていない関数に送信されました。

いいえ

ユーザートラフィックの速度制限

FcCommonError

429

同時実行数を減らすか、Function Compute チームに連絡して同時実行制限を増やすことができます。

いいえ

システムエラーが発生しました。

FcCommonError

500

Function Compute でシステムエラーが発生しました。もう一度試してください。

いいえ

システムトラフィックの速度制限

FcCommonError

503

Function Compute でシステム速度制限エラーが発生しました。指数バックオフモードで再試行できます。

いいえ

WebSocket ハンドシェイクの完了後に発生するエラーは、関数コードが原因です。トラブルシューティングのために、コードを確認するか、コードの実行中に生成されたログを表示できます。詳細については、「関数呼び出しログを表示する」をご参照ください。

追加情報

  • WebSocket には、ランタイム、タイムアウト期間、データ転送に制限があります。詳細については、「WebSocket の制限」をご参照ください。

  • HTTP トリガーは、同期呼び出しと非同期呼び出しをサポートしています。詳細については、「呼び出し方法」をご参照ください。

  • Function Compute では、オリジン間で HTTP 関数を呼び出すことができます。オリジン間リソース共有 (CORS) リクエストを処理する方法については、「CORS リクエストの処理」をご参照ください。