AWSでWebSocket通信の格ゲーを作ろうとしたときにつまずいた点をまとめていきます(備忘録)
API Gatewayの$connectルートに統合したLambda内でpost_to_connectionしようとするとGone Exceptionエラーが出る。
boto3ドキュメントを確認すると、
https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/apigatewaymanagementapi/client/exceptions/GoneException.html
渡されたIDでの接続が見つからないときに投げられるエラーとのこと。
APIGWの$connectに関するドキュメントを確認すると、
”Until execution of the integration associated with the \$connect route is completed, the upgrade request is pending and the actual connection will not be established. If the $connect request fails (e.g., due to AuthN/AuthZ failure or an integration failure), the connection will not be made.”
(出典)https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-route-keys-connect-disconnect.html
とのこと。つまり$connectルートに統合されたアクション(今回の場合はLambda)が完了するまでは接続が確立しないらしい。
接続が確立していないのにconnectionIDが渡されたものだから、有効になっているものと思い込んでpost_to_connectionしてしまっていた、というのが本件の顛末でした。マッチング相手にマッチメイキング完了通知を送りたいのであれば、
一回クライアント経由してsendさせる➤sendmessageルート➤Lambdaでマッチ相手にpostさせようと思う。