この記事は全部俺 Advent Calendar 2018の19日目の記事です。
この記事について
Amazon API GatewayでWebsocketが利用可能になりました。
これによって、Websocketを使用した双方向通信がサーバレスで実現できます!
Websocketでつながっているユーザであれば、バックエンド側からのpush通知も可能になります!
早速試してみたので記事にしてみます。
ちなみに動作しているところはこんな感じです。
websocket chat app on AWS Lambda(serverless) pic.twitter.com/AGZ1a2ZIP5
— tez (@te22eret) 2018年12月19日
バックエンド側から特定のユーザのみにメッセージを送っているところはこんな感じです。
コンソール1ではメッセージを受け取っていますが、コンソール2では受け取っていないことがわかります。

環境構築
基本的にこのページに従って環境構築をしていきます。
- 
simple-websockets-chat-appのAWS Serverless Application Repositoryから、Deployを選択
- 
Amazon API Gatewayから、Choose the protocolで、WebSocketを選択してAPIを作成
- 
Amazon API GatewayのRoutesから、$connect,$disconnect,sendmessage,$defaultにて呼び出すLambdaをそれぞれ設定してステージング
- 
wscatを使ってテスト
参考までに、sendmessageのAmazon API GatewayのRoutes設定は以下のようになります。

これだけでWebsocketを用いた簡単なチャットアプリがサーバレスで使用できます!
このサンプルだとバックエンド側から特定のユーザのみへのメッセージを送るLambdaが含まれていませんが、sendmessageのfunctionを参考に実装すると上で貼ったGIFのような動作をさせることができます。
postParams.ConnectionIdにDynamoDBのsimplechat_connectionsテーブルが作成されており、そこにconnectionIDが入力されているので、それを使用すれば特定のユーザのみへチャットを送ることが可能です!
まとめ
今回使用したサンプルではランダムにconnectionIDが作成されていますが、ユーザごとに固有の値を入力したり、ユーザとconnectionIDを紐づけておけば、もっと簡単にユーザごとへのDMを送ることができそうですね。
LambdaとAPI Gatewayをいつものように書いて、ちょっと設定を変えるだけで簡単にWebsocketを用いた双方向通信をサーバレスで実現することができるのはすごく良いですね!
