Closed5

駐在型のdiscord botをapi gateway & lambdaで作れなかった

2357gi2357gi

結論

メッセージ送信リアクション付与/剥奪 などをトリガーとしてアクションを起こすdiscord botは、現状サーバーレスでは作れない。

それらの機能を持つdiscord botを動かすためには、discord serverとwebsocketを繋ぎ、Gateway Events を受け取る必要がある。
しかし、api gateway websocket apiから外部のwebsocket apiへ能動的な接続を行うことができない為。
(api gateway websocket apiはwebsocketを受けることはできるが、繋ぎに行くことはできない)


ただし、 / で始まるコマンドを起点としたbotであれば、api gateway とlambdaで作ることができる。
https://dev.classmethod.jp/articles/discord-application-commands-aws-lambda-aws-cdk/

また、最近Lambdaからそのままhttpsのendpointを生やすことができる機能が追加されたので、それでもいけるかも

2357gi2357gi

当初の目的

メッセージの投稿や、リアクションのイベントをもとに何かしらを行う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を使用することはできない。

2357gi2357gi

Intentsを使用するbotをサーバーレスで作成は難しそう。

/コマンドのbotは /コマンドが呼び出されたとき webhookを呼び出すことができるので、そのイベント駆動で api gateway & lambdaでのサーバーレス構成ができる。

また、スラッシュコマンド以外に、メッセージのオプションからアプリを呼び出すアクション(下図)や、スラッシュコマンドで呼び出したモーダルからも呼び出すことができる。

https://dev.classmethod.jp/articles/discord-application-commands-aws-lambda-aws-cdk/

ステートはdynamodbを使ってなんとかするか、もしくはSQS等のpubsubに突っ込んで非同期で処理(許されるのであれば)が安く住みそう。

2357gi2357gi

メモ
コマンドからフォーム出してそれに回答するやつとか、メッセージを指定してアプリ呼び出すやつはエンドポイントがあるので行ける。

このスクラップは2023/10/10にクローズされました