Function Compute は HTTP トリガーをサポートしており、WebSocket リクエストを使用して関数を呼び出すことができます。関数は、WebSocket リクエストを処理し、結果をクライアントに返す Web サーバーとして機能します。このトピックでは、Function Compute コンソールでこの目的のために HTTP トリガーを設定する方法について説明します。
前提条件
Node.js 14 ランタイムを使用する関数が作成されていること。詳細については、「関数の作成」をご参照ください。
ステップ 1:トリガーの作成
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、を選択します。
上部のナビゲーションバーでリージョンを選択します。関数ページで、対象の関数をクリックします。
関数詳細ページの トリガー タブで、トリガーの作成 をクリックします。
[トリガーの作成] パネルでパラメーターを設定し、OK をクリックします。
設定項目
操作
例
トリガータイプ
HTTP トリガー を選択します。
HTTP トリガー
名前
カスタムのトリガー名を入力します。
http-trigger
バージョンまたはエイリアス
デフォルト値は LATEST です。別のバージョンまたはエイリアスのトリガーを作成するには、まず関数詳細ページの バージョンまたはエイリアス ドロップダウンリストからそのバージョンを選択する必要があります。バージョンとエイリアスの概要については、「バージョンの管理」および「エイリアスの管理」をご参照ください。
LATEST
リクエストメソッド
この HTTP トリガーをトリガーできるメソッドを指定します。
GET, POST, PUT, DELETE
インターネット URL を無効にする
デフォルトでは、このオプションは無効になっており、トリガーはパブリックドメイン名からアクセスできます。
このオプションを有効にすると、HTTP トリガーにデフォルトのパブリックドメイン名は提供されません。その後、パブリックドメイン名を使用して関数を呼び出すと、
access denied due to function internet URL is disableエラーが報告されます。カスタムドメイン名によるアクセスは影響を受けません。いいえ
認証方式
Function Compute が HTTP リクエストを認証するために使用するメソッドを選択します。次の値が使用可能です:
認証なし:HTTP リクエストに身分認証は不要です。匿名アクセスがサポートされています。誰でも HTTP リクエストを送信して関数を呼び出すことができます。
署名認証:HTTP リクエストに身分認証が必要です。署名認証のサンプルコードについては、「署名を使用して HTTP トリガー URL にアクセスする」をご参照ください。
基本認証:HTTP リクエストに身分認証が必要です。基本認証のサンプルコードについては、「HTTP トリガーの基本認証を設定する」をご参照ください。
JWT 認証:HTTP リクエストに JWT 認証が必要です。詳細については、「HTTP トリガーの JWT 認証を設定する」をご参照ください。
Bearer 認証:HTTP リクエストに Bearer 認証が必要です。詳細については、「HTTP トリガーの Bearer 認証を有効にする」をご参照ください。
認証なし
トリガーを作成した後、バージョンまたはエイリアス、リクエストメソッド、認証方式 などの設定項目を変更できます。
ステップ 2:コードの作成とデプロイ
関数詳細ページで、コード タブをクリックします。コードエディタでコードを記述し、コードのデプロイ をクリックします。
コンソールの WebIDE の現在のディレクトリで、次のコードを index.js ファイルにコピーします。このトピックでは、Node.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 サーバーは、IP アドレス
0.0.0.0でリッスンする必要があり、127.0.0.1やlocalhostではありません。カスタムリスナーポートを設定しない場合、デフォルトでポート9000が使用されます。WebIDE のディレクトリ構造は次の図のようになります:

WebIDE のターミナルで、
npm install wsコマンドを実行して依存関係をインストールします。インストールが完了すると、package-lock.json ファイルが自動的に生成されます。ディレクトリ構造は次の図のようになります:

コードのデプロイ をクリックして、コードを Function Compute にデプロイします。
ステップ 3:関数のテスト
関数詳細ページで、トリガー タブをクリックして、トリガーのパブリックエンドポイントを表示およびコピーします。

Postman を使用して関数をテストします。
URL を Postman にコピーし、スキームを HTTPS から WSS に変更します。詳細については、「Postman」をご参照ください。
課金方法
WebSocket の課金方法は HTTP と同じです。WebSocket 接続は、長時間実行される HTTP 呼び出しとして課金されます。
同時実行数が 1 に設定されている関数の場合、課金は WebSocket 接続が確立されたときに開始され、閉じられたときに終了します。
同時実行数が 1 より大きい関数の場合、インスタンスの課金は最初の WebSocket 接続が受信されたときに開始され、最後の WebSocket 接続が閉じられたときに終了します。同じインスタンス上の同時接続に対して複数回課金されることはありません。
次の図に示すように、関数の同時実行数は 2 に設定されています。最初のリクエストは T1 に到着し、T3 で終了します。2 番目のリクエストは T2 に到着し、T4 で終了します。課金対象期間は T4-T1 です。T2 から T3 までの期間は 1 回のみ課金されます。

詳細情報
リクエストのタイムアウト
Function Compute は、WebSocket リクエストと HTTP リクエストに同じ実行タイムアウトを適用します。WebSocket 接続の生存時間 (TTL) が設定された実行タイムアウトを超えた場合、Function Compute は接続を強制的にクローズします。クライアントは状態コード 1006 を受信します。
接続のキープアライブとタイムアウト時の再接続
WebSocket 接続が確立された後、Function Compute はお客様のロジックに干渉しませんが、実行タイムアウトを超えると接続を閉じます。 接続を介して一定期間データが送信されない場合、NAT Gateway などの中間ネットワークノードが接続を閉じる可能性があります。 この場合、WebSocket プロトコルの Ping フレームと Pong フレームを使用して、接続を維持したり、その可用性を確認したりできます。
ビジネス要件で接続が Function Compute の提供する最大リクエストタイムアウトを超える場合、またはアプリケーションで安定した論理接続を維持する必要がある場合は、クライアントコードに再接続メカニズムを追加する必要があります。このメカニズムは、Reconnecting-WebSocket や Socket.IO などのライブラリを使用して実装できます。
スティッキーセッション (セッションアフィニティ)
Function Compute はステートレスです。高い同時実行性の関数では、Function Compute は、同じクライアントからの複数のリクエストが同じコンテナーインスタンスによって処理されることを保証できません。複数のコンテナーインスタンス間で WebSocket リクエストの状態を維持するには、Redis、Memcached、Kafka、データベースなどの外部ストレージを使用する必要がある場合があります。
例えば、チャットルームアプリケーションでは、Function Compute はすべてのユーザーが同じ関数インスタンスに接続することを保証できません。そのため、関数は Redis の publish/subscribe (pub/sub) 機能を使用してチャットルームを作成できます。ユーザーがチャットルームに参加すると、そのルームのチャンネルをサブスクライブします。ユーザーがメッセージを送信すると、関数がそれを受信し、Redis のルームのチャンネルにパブリッシュします。同じチャットルームのすべてのユーザーがチャンネルをサブスクライブしているため、すべてのユーザーがメッセージを受信します。
その他の例
カスタムランタイム | カスタムコンテナー |
よくある質問
WebSocket 関数が実行できないのはなぜですか?
トリガーを作成したばかりの場合は、キャッシュが更新されるまで約 10 秒待ってから、もう一度お試しください。
関数コード内の依存関係パッケージが正しくインストールされているか確認してください。詳細については、「関数のサードパーティ依存関係をインストールする」をご参照ください。
関数が正しいポートと IP アドレスでリッスンしているか確認してください。リスニング IP アドレスは
0.0.0.0である必要があり、127.0.0.1やlocalhostではありません。カスタムリスナーポートを設定しない場合、デフォルトでポート9000が使用されます。
トラブルシューティング
WebSocket ハンドシェイクが完了する前に発生するエラーは、主に 2 つのタイプに分けられます:
リクエストエラー:送信されたリクエストが標準を満たしていません。4xx ステータスコードが返されます。
関数エラー:関数コードに問題があります。5xx ステータスコードが返されます。
エラータイプ | HTTP ステータスコード | 原因分析 | 課金 |
リクエストエラー | 400 | リクエストがリクエスト制限を超えています。詳細については、「HTTP トリガーの概要」をご参照ください。 | いいえ |
400 | 身分認証が必要な関数を呼び出すリクエストに、Date または Authorization 情報が含まれていません。 | いいえ | |
403 | 身分認証が必要な関数を呼び出すリクエストの署名が正しくありません。これは、Authorization が正しくないことを意味します。署名の計算には Date ヘッダーが使用され、署名は 15 分間しか有効でないため、署名が期限切れになっている可能性があります。一般的な原因は、リクエストヘッダーで送信された Date が現在時刻より 15 分以上前であることです。 | いいえ | |
403 | リクエストが、HTTP トリガーに設定されていないリクエストメソッドを使用しています。WebSocket 関数では、HTTP トリガーが GET メソッドをサポートする必要があります。このメソッドが設定されていない場合、このエラーが報告されます。 | いいえ | |
404 | WebSocket リクエストが、HTTP トリガーを持たない関数に送信されました。 | いいえ | |
ユーザーによるスロットリング | 429 | ユーザーがスロットリングされています。同時実行数を減らすか、Alibaba Cloud Function Compute チームに連絡して同時実行数の上限の引き上げを依頼してください。 | いいえ |
システムエラー | 500 | Function Compute のシステムエラーが発生しました。リトライすることで問題を解決できます。 | いいえ |
システムによるスロットリング | 503 | Function Compute システムによる速度制限です。エクスポネンシャルバックオフを使用してリトライできます。 | いいえ |
WebSocket ハンドシェイクが完了した後に発生するエラーは、お客様の機能コードが原因です。お客様のコードを確認するか、コードの実行中に生成されたログを表示してください。詳細については、「呼び出しログを表示する」をご参照ください。
詳細情報
Function Compute コンソールに加えて、次の方法でトリガーを設定することもできます:
Serverless Devs ツールを使用してトリガーを設定します。詳細については、「Serverless Devs の一般的なコマンド」をご参照ください。
SDK を使用してトリガーを設定します。詳細については、「SDK」をご参照ください。
トリガーを変更または削除するには、「トリガーの管理」をご参照ください。