サーバーレスで簡単に利用できるようになるとアプリの幅も広がり、いろいろなことができるようになります。2018年12月現在、暫定の実装になるとのことです。正式版では構文など変わる可能性があることに注意が必要です。本記事の開発環境は以下となります。サーバーに対して接続、リクエストを送り、処理結果のレスポンスを受け取り、切断終了の流れになります。必要に応じて、このリクエスト/レスポンスのやり取りを繰り返す形になります。サーバーに接続後、コネクションを維持したまま双方向でメッセージを送ることができます。これは通常のリクエスト/レスポンスに当たるやり取りのほかに、サーバー側から任意のタイミングでメッセージを送れます。🎶」では、演奏者へのフィードバックとして「👍」を送ることができ、その数をリアルタイムでカウントする機能があります。繰り返し「リクエスト/レスポンス」して受け取る必要が出てきます。仮に数に変化がなかったとしてもアプリ側は知るすべがないので、繰り返し「👍」の数を取得しに行かなければなりません。使える場合、コネクションは維持したまま必要な時に「👍」の数をサーバー側がアプリへメッセージを送ることができるようになります。「👍」の数に変化がなかった場合は維持されているコネクションの中にメッセージが流れないだけでアプリはとくに何もする必要はありません。変化があった時だけサーバーが教えてくれるので、それに応じてアプリの表示を変えるだけになります。これにより不要なリクエスト/レスポンスを減らせるほか、よりリアルタイムに近い状態で変化を受け取ることができるようになります。ベースでは「リクエスト/レスポンス」で受け取り、次のリクエストを出すまでの間にあった変化は結果しか受け取れません。10になっているかもしれません。メッセージを返せます。これにより、よりスムーズに描画を変えていくことができるようになります。これはチャットのようなコミュニケーションや金融などの取引の価格情報などに使うことができます。対応したので、その使い方をチャットを実装することで確認します。Databaseを使って実現しています。プロジェクトを作成します。プロジェクトのディレクトリを作成しプロジェクトのひな型を作ります。wscat、必要なパッケージを最新化してインストールします。グローバルに追加して使うようですが、複数人開発でグローバルのを使っているとバージョンの違いなどでトラブルがあったのでpackage.jsonで明示して、それを使うようにしているためです。試すにはグローバルでもよいでしょう。aws-sdkpackage.jsonをプロジェクトに合わせて修正します。namedescriptionauthorあたりを合わせるとよいでしょう。trueを設定しておくとよいでしょう。Documentationをご確認ください。使うためのserverless-websockets-pluginを追加します。呼び出すためのexecute-api:ManageConnectionsに許可を与えます。関する許可も与えます。websocketApiNameは管理用にわかりやすい名前を設定しておくとよいでしょう。イベントとアクションに合わせて定義を行います。接続と切断に対応します。$defaultはマッチするアクションがない場合に呼び出されます。受け取るメッセージのキーになります。actionに入る文字列のマッチングになります。今回は最低限のConnectionIdだけを管理します。名前など無しの完全に匿名のメッセージだけのチャットになります。実装handler.tsに処理を実装します。型定義がまだ入っていないので補完するために宣言しています。requestContextに入ってくるdomainNameとconnectionIdが必要なため追加しています。型定義が更新されたら不要となります。メッセージを返す際にendpointが必要となり、これがdomainNameとstageから決まってきます。固定値の場合はよいのですが、今回のように動的に決まってくる場合はrequestContextから受け取ったdomainNameとstageが必要なため毎回インスタンスを生成しています。エントリーポイントと実装があります。「接続/切断」の際に呼び出されます。保存し、切断時に削除しています。切断は呼び出されないこともあるので、注意が必要です。受け取ったメッセージに対応するアクションがなかった場合に呼び出されます。クライアントに返しています。メッセージを返すにはApiGatewayManagementApiのpostToConnection()を呼び出します。その際にクライアントのconnectionIdが必要となります。この関数のようにメッセージを送ってきたクライアントだけにメッセージを送る場合はrequestContextのconnectionIdが使えるので、それを使ってエラーメッセージを返します。最後のsendMessageは、チャットのコメントを送る処理になります。使う処理の肝となる部分です。複数クライアントにメッセージを返すには、メッセージを送るべきクライアントすべてのconnectionIdが必要となり、それぞれにApiGatewayManagementApi#postToConnection()を行う必要があります。用意しているものになります。コネクション管理テーブルをスキャンし、全件に対してApiGatewayManagementApi#postToConnection()を呼び出しています。(なんか、もっとスマートな実装できないかなぁ)ApiGatewayManagementApi#postToConnection()を呼び出す際に、コネクションが切断されているクライアントがありえます。先ほど「切断は呼び出されないこともあるので、注意が必要です。」と書きました通り、クライアントが切断されてもイベントが呼び出されないケースもあります。削除されずconnectionIdが残るケースもありえます。該当するconnectionIdを削除しておき再発防止しておきます。やってくれるので、以下のコマンドで行えます。用意とプロファイルを設定しておきます。