駐在型のdiscord botをapi gateway & lambdaで作れなかった
結論
メッセージ送信
や リアクション付与/剥奪
などをトリガーとしてアクションを起こすdiscord botは、現状サーバーレスでは作れない。
それらの機能を持つdiscord botを動かすためには、discord serverとwebsocketを繋ぎ、Gateway Events を受け取る必要がある。
しかし、api gateway websocket apiから外部のwebsocket apiへ能動的な接続を行うことができない為。
(api gateway websocket apiはwebsocketを受けることはできるが、繋ぎに行くことはできない)
ただし、 /
で始まるコマンドを起点としたbotであれば、api gateway とlambdaで作ることができる。
また、最近Lambdaからそのままhttpsのendpointを生やすことができる機能が追加されたので、それでもいけるかも
当初の目的
メッセージの投稿や、リアクションのイベントをもとに何かしらを行うbotを、高可用性、高耐障害性、高コスパで実装するための方法を考えた.
その中のアイディアの一つとして、api gatewayのwebsocket apiとlambdaを使用してできるのではないかと考えた。
discord botの諸々
メッセージの投稿/メッセージへのリアクションの付与などのイベントをもとに何かしらを行うbotは、discord serverとwebsocketのコネクションを確立し、その中でメッセージの送受信を行う。
使用するawsサービス
lambda
(略)
api gateway websocket api
api gatewayでwebsocket apiを提供することができる。
api gatewayがwebsocket のコネクションを確立 & 管理することができる。
接続開始・終了時に発火するlambda, メッセージ受信時に発火するlambda(どのメッセージがどのlambdaを発火するかなども設定可能) を設定することができる。
がしかし、api gateway側から外部のwebsocket apiに接続を行い、コネクションを管理することはできない。
よってapi gatewayを使用することはできない。
Intentsを使用するbotをサーバーレスで作成は難しそう。
/
コマンドのbotは /
コマンドが呼び出されたとき webhookを呼び出すことができるので、そのイベント駆動で api gateway & lambdaでのサーバーレス構成ができる。
また、スラッシュコマンド以外に、メッセージのオプションからアプリを呼び出すアクション(下図)や、スラッシュコマンドで呼び出したモーダルからも呼び出すことができる。
ステートはdynamodbを使ってなんとかするか、もしくはSQS等のpubsubに突っ込んで非同期で処理(許されるのであれば)が安く住みそう。
全てのイベント(Intents)をoutgoing webhookで実装してくれってissueは2年前から立ってはいるが、音沙汰は無いので難しそう。
通信コストとかdiscord側が負担するコストは多くなるだろうし難しそうだね…。
メモ
コマンドからフォーム出してそれに回答するやつとか、メッセージを指定してアプリ呼び出すやつはエンドポイントがあるので行ける。