API Gateway Websocket を Golang でためしてみる

2021.06.09

タイトルの通りです。 既出かと思いますが、terraformaws-sdk-go-v2を使っているので特定の人には需要あるかと思いブログ化しました。

参考にしたサイト

GitHub

構成図

解説

ベーシックなパターンで実装しました。

いちおうクリーンアーキテクチャを意識した構成になっています。 ただ、時間がなく認可処理と細かなエラーハンドリングは実装していません。

クライアントは、connectionルートで接続を開始し、disconnectionルートで接続を終了します。 接続開始時には、API Gatewayより自動発行されるconnectionIdをDynamoDBへ保存します。 接続終了時には、connectionIdをDynamoDBから削除します。

接続中は、$request.body.actionの値によってルーティングを振り分けています。 下記のようなメッセージを送信すれば、send_messageにルーティングされ、対応したLambdaがキックされます。

  {
    "action": "send_message",
    "targetId": "xxxx",
    "message": "hello world"
  }

Lambda内部では、targetIdに指定した値で接続しているユーザーに対してメッセージを送信します。

動作確認

AWSへのデプロイなどはGitHubのREADMEを参考にしてください。

wscatを使って動作確認していきます。

  • コマンド例
wscat -c wss://<api-id>.execute-api.<region>.amazonaws.com/<stage>
  • 送信メッセージ例
{"action": "send_message", "targetId": "xxx", "message": "hello world"}

まとめ

以上どなたかの参考になれば幸いです。