

# 接続されたユーザーとクライアントアプリを管理する: `$connect` ルートおよび `$disconnect` ルート
<a name="apigateway-websocket-api-route-keys-connect-disconnect"></a>

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

**Topics**
+ [`$connect` ルート](#apigateway-websocket-api-routes-about-connect)
+ [`$connect` ルートからの接続情報の受け渡し](#apigateway-websocket-api-passing-connectionId-on-connect)
+ [`$disconnect` ルート](#apigateway-websocket-api-routes-about-disconnect)

## `$connect` ルート
<a name="apigateway-websocket-api-routes-about-connect"></a>

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

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

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

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

`$connect` の統合の設定はオプションです。次の場合は `$connect` 統合の設定を検討してください。
+ `Sec-WebSocket-Protocol` フィールドを使用して、クライアントがサブプロトコルを指定できるようにする。サンプルコードについては、「[WebSocket サブプロトコルを必要とする `$connect` ルートを設定する](websocket-connect-route-subprotocol.md)」を参照してください。
+ クライアントが接続したときに通知を受ける。
+ 接続をスロットリングする、または接続するユーザーを管理する。
+ バックエンドで、コールバック URL を使用してメッセージをクライアントに送信する。
+ 各接続 ID およびその他の情報をデータベース (例: Amazon DynamoDB) に保存する。

## `$connect` ルートからの接続情報の受け渡し
<a name="apigateway-websocket-api-passing-connectionId-on-connect"></a>

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

### プロキシ統合を使用して接続情報を渡すには
<a name="websocket-connect-proxy-integration"></a>

イベントでは、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}
```

------

### 非プロキシ統合を使用して接続情報を渡すには
<a name="websocket-connect-non-proxy-integration"></a>
+ 非プロキシ統合により接続情報にアクセスできます。統合リクエストを設定し、WebSocket API リクエストテンプレートを提供します。以下の、[Velocity Template Language (VTL)](https://velocity.apache.org/engine/devel/vtl-reference.html) マッピングテンプレートは、統合リクエストを提供します。このリクエストは、以下の詳細を非プロキシ統合に送信します。
  + 接続 ID
  + ドメイン名
  + ステージ名
  + パス
  + ヘッダー
  + クエリ文字列

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

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

  データ変換の設定の詳細については、「[API Gateway での WebSocket API のデータ変換](websocket-api-data-transformations.md)」を参照してください。

  統合リクエストを完了するには、統合レスポンスに `StatusCode: 200` を設定します。統合レスポンスの詳しい設定方法については、「[API Gateway コンソールを使用した統合レスポンスの設定](apigateway-websocket-api-integration-responses.md#apigateway-websocket-api-integration-response-using-console)」を参照してください。

## `$disconnect` ルート
<a name="apigateway-websocket-api-routes-about-disconnect"></a>

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

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

バックエンドは、`@connections` API を使用して切断を開始できます。詳細については、「[バックエンドサービスでの `@connections` コマンドの使用](apigateway-how-to-call-websocket-api-connections.md)」を参照してください。