接続されたユーザーとクライアントアプリを管理する: $connect ルートおよび $disconnect ルート - Amazon API Gateway

接続されたユーザーとクライアントアプリを管理する: $connect ルートおよび $disconnect ルート

次のセクションでは、WebSocket API の $connect ルートおよび $disconnect ルートを使用する方法について説明します。

$connect ルート

クライアントアプリは、WebSocket アップグレードリクエストを送信して WebSocket API に接続します。リクエストが成功すると、接続が確立されている間に $connect ルートが実行されます。

WebSocket 接続はステートフルな接続であるため、$connect ルートのみで認証を設定できます。AuthN/AuthZ は接続時にのみ実行されます。

$connect ルートに関連付けられている統合の実行が完了するまで、アップグレードリクエストは保留中になり、実際の接続は確立されません。$connect リクエストが失敗した場合 (AuthN/AuthZ の障害や統合の障害など)、接続は行われません。

注記

$connect で承認が失敗した場合、接続は確立されず、クライアントは 401 または 403 レスポンスを受け取ります。

$connect の統合の設定はオプションです。次の場合は $connect 統合の設定を検討してください。

  • Sec-WebSocket-Protocol フィールドを使用して、クライアントがサブプロトコルを指定できるようにする。サンプルコードについては、「WebSocket サブプロトコルを必要とする $connect ルートを設定する」を参照してください。

  • クライアントが接続したときに通知を受ける。

  • 接続をスロットリングする、または接続するユーザーを管理する。

  • バックエンドで、コールバック URL を使用してメッセージをクライアントに送信する。

  • 各接続 ID およびその他の情報をデータベース (例: Amazon DynamoDB) に保存する。

$connect ルートからの接続情報の受け渡し

プロキシ統合と非プロキシ統合の両方を使用して、$connect ルートからデータベースまたは他の AWS のサービス に情報を渡すことができます。

プロキシ統合を使用して接続情報を渡すには

イベントでは、Lambda プロキシ統合から接続情報にアクセスできます。別の AWS のサービス または AWS Lambda 関数を使用して接続に投稿します。

次の Lambda 関数は、requestContext オブジェクトを使用して接続 ID、ドメイン名、ステージ名、およびクエリ文字列を記録する方法を示しています。

Node.js
export const handler = async(event, context) => { const connectId = event["requestContext"]["connectionId"] const domainName = event["requestContext"]["domainName"] const stageName = event["requestContext"]["stage"] const qs = event['queryStringParameters'] console.log('Connection ID: ', connectId, 'Domain Name: ', domainName, 'Stage Name: ', stageName, 'Query Strings: ', qs ) return {"statusCode" : 200} };
Python
import json import logging logger = logging.getLogger() logger.setLevel("INFO") def lambda_handler(event, context): connectId = event["requestContext"]["connectionId"] domainName = event["requestContext"]["domainName"] stageName = event["requestContext"]["stage"] qs = event['queryStringParameters'] connectionInfo = { 'Connection ID': connectId, 'Domain Name': domainName, 'Stage Name': stageName, 'Query Strings': qs} logging.info(connectionInfo) return {"statusCode": 200}

非プロキシ統合を使用して接続情報を渡すには

  • 非プロキシ統合により接続情報にアクセスできます。統合リクエストを設定し、WebSocket API リクエストテンプレートを提供します。以下の、Velocity Template Language (VTL) マッピングテンプレートは、統合リクエストを提供します。このリクエストは、以下の詳細を非プロキシ統合に送信します。

    • 接続 ID

    • ドメイン名

    • ステージ名

    • パス

    • ヘッダー

    • クエリ文字列

    このリクエストは、接続 ID、ドメイン名、ステージ名、パス、ヘッダー、クエリ文字列を非プロキシ統合に送信します。

    { "connectionId": "$context.connectionId", "domain": "$context.domainName", "stage": "$context.stage", "params": "$input.params()" }

    データ変換の設定の詳細については、「API Gateway での WebSocket API のデータ変換」を参照してください。

    統合リクエストを完了するには、統合レスポンスに StatusCode: 200 を設定します。統合レスポンスの詳しい設定方法については、「API Gateway コンソールを使用した統合レスポンスの設定」を参照してください。

$disconnect ルート

$disconnect ルートは、接続を閉じた後に実行されます。

接続は、サーバーまたはクライアントによって閉じることができます。接続が実行されると、接続がすでに閉じられているため、$disconnect がベストエフォート型のイベントです。API Gateway は、統合に $disconnect イベントを配信するために最善を尽くしますが、配信を保証することはできません。

バックエンドは、@connections API を使用して切断を開始できます。詳細については、「バックエンドサービスでの @connections コマンドの使用」を参照してください。