Function Compute では、WebSocket リクエストに応答するように関数の HTTP トリガーを構成できます。関数の HTTP トリガーを構成すると、関数は Web サーバーとして機能して WebSocket リクエストを処理し、呼び出し元にレスポンスを返します。
始める前に
手順 1: 関数を作成する
Function Compute コンソール にログインします。左側のナビゲーションウィンドウで、[サービスと関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。[サービス] ページで、目的のサービスをクリックします。
- [関数] ページで、[関数の作成] をクリックします。
[関数の作成] ページで、カスタムランタイムの使用 を選択し、パラメーターを構成して、[作成] をクリックします。
以下の項目では、構成する必要があるパラメーターについて説明します。リストされていないその他のパラメーターについては、デフォルト値を保持します。詳細については、「関数の作成」をご参照ください。
関数名: 関数名を入力します。例: websocket-demo。
ハンドラータイプ: HTTP ハンドラー を選択します。
ランタイム: ドロップダウンリストから Node.js 18 を選択します。
手順 2: コードを記述してデプロイする
関数の詳細ページで、[コード] タブをクリックし、コードエディターに関数コードを入力します。
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 のディレクトリ構造を示しています。

WebIDE ターミナルで、
npm install wsコマンドを実行して依存関係をインストールします。 Python ランタイムに依存関係をインストールする方法については、「Function Compute コンソールを使用して依存関係をインストールする」をご参照ください。依存関係がインストールされると、package-lock.json ファイルが自動的に生成されます。次の図は、ディレクトリ構造を示しています。

[デプロイ] をクリックして、Function Compute にコードをデプロイします。
手順 3: 関数をテストする
関数の詳細ページで、[トリガー] タブをクリックして、トリガーのパブリックエンドポイントを表示してコピーします。
説明HTTP トリガーが作成されると、パブリックエンドポイントは変更されません。
Postman を使用して関数をテストします。 詳細については、「Postman」をご参照ください。
Postman で WebSocket リクエストを作成します。
パブリックエンドポイントを Postman にコピーし、スキームパラメーターの値を HTTPS から WebSocket Secure (WSS) に変更します。
ビジネス要件に基づいてパラメーターとヘッダーを構成します。
WebSocket に接続します。接続が確立されたら、メッセージを送信できます。
送信するメッセージを入力し、関数がメッセージを受信するかどうかを確認します。
実行タイムアウト期間が経過すると、WebSocket への接続は終了します。
次の図は、テストプロセスを示しています。

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

詳細情報
リクエストタイムアウト
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 回だけ請求されます。

例
カスタムランタイム | カスタムコンテナーランタイム |
FAQ
追加情報
WebSocket には、ランタイム、タイムアウト期間、データ転送に制限があります。詳細については、「WebSocket の制限」をご参照ください。
HTTP トリガーは、同期呼び出しと非同期呼び出しをサポートしています。詳細については、「呼び出し方法」をご参照ください。
Function Compute では、オリジン間で HTTP 関数を呼び出すことができます。オリジン間リソース共有 (CORS) リクエストを処理する方法については、「CORS リクエストの処理」をご参照ください。