1 of 16

Discord Botは�サーバーレス化の夢を見るか?

MCC B4 Arc

1

2022/12/17

2 of 16

自己紹介

2

2022/12/17

3 of 16

自己紹介

  • Arc
    • 東京農工大学MCC B4
    • Twitter: @a4rcvv
    • 最近は強化学習をする人になっています
    • 情報処理学会のため,�3月にも電通大に来ることに
      • 1月中旬に記事投稿しないといけないらしい

3

2022/12/17

4 of 16

LT本編

4

2022/12/17

5 of 16

Discord Bot

  • Discord使ってますか?使ってますね?
  • Discord Botの作例を紹介しつつ,�Discord Botの仕組みと�サーバーレスDiscord Botの可能性について検討�

5

2022/12/17

6 of 16

作例: MCC入退室管理Bot

  • 学生証などをタッチすると�入退室ログを記録してくれる
  • 部内Discordに通知してくれる

6

2022/12/17

7 of 16

作例: MCC入退室管理Bot

  • モチベーション:
    • コロナウイルスが流行していた時: 入室人数管理
    • 落ち着いてきた時: 部室内で部員のつながりを生むため
      • 「hoge氏いるから俺も行こう」的な効果を期待
  • サークルの同期3人で開発

7

2022/12/17

8 of 16

作例: MCC入退室管理Bot

  • アーキテクチャ
    • DBは外部サービス�(MongoDB Atlas)を利用
      • Raspberry Piのデータは�吹っ飛びやすい
      • 無料で使えるDBaaS
    • Discord.jsを採用
      • Discord.pyは,�開発当時メンテナンスが�止まっていた

8

2022/12/17

Discord

Bot Process�(Node.js)

NFC Process (Python)

MongoDB Atlas

Raspberry Pi 3B

NFC Reader

NFCカード情報

カード情報

コマンド情報�レスポンス

永続化データ

9 of 16

一般的なBotのアーキテクチャ図

  • Discord側で発生したイベントが�WebSocket経由で送られる
    • メッセージが送られたとき
    • コマンドが使われたとき など
  • WebSocketの利用のため�サーバーを動かすことが必須
    • サーバー管理,めんどくさい

9

2022/12/17

Gateway API

REST API

Library�(Discord.js)

WebSocket

HTTP

Bot

サーバー�(Node.js)

Discord API

10 of 16

スラッシュコマンド時代の到来

  • Discordでスラッシュコマンドが使えるようになった
    • Botに対して色々コマンドを送信できる
  • 入退室管理Botにも実装している
    • /list で入室中の人を表示 など

10

2022/12/17

↑こんな感じ

11 of 16

古のコマンド vs スラッシュコマンド

古のコマンド

  • 補完機能あり
  • Webhookでコマンドを受け取れる
    • サーバーレス化が可能に...!?

スラッシュコマンド

  • コマンドを気合いで覚えて�テキストとして送信
    • 覚えるのがしんどい
    • コマンドパースがしんどい
    • そもそも今はこの方法を使えない

11

2022/12/17

12 of 16

サーバーレスBotのアーキテクチャ図

  • Discord側のイベントが�Webhook経由で送られる
    • ただのHTTPリクエスト
  • 情報取得・メッセージ送信などは�REST API経由で可能
    • ただのHTTPリクエスト
  • 全部HTTPで完結できるので�FaaS(Function as a Service)に�デプロイできる
    • Google Cloud Functions
    • AWS Lambda

12

2022/12/17

Webhook

REST API

HTTP

HTTP

Bot

FaaSにデプロイ�(Lambda, Cloud Functions)

Discord API

13 of 16

問題点(1): コールドスタート問題

  • Discordではなく,FaaS特有の問題
  • 関数を久しぶりに呼び出したときに�応答に時間がかかる
    • 起動した後に放置していると�計算リソースが破棄されるため,�リソース確保からやり直す必要がある

13

2022/12/17

リソース確保

コンテナ起動

データ受信

関数実行

コールドスタート時�だけ実行

実行の流れ

14 of 16

問題点(1): コールドスタート問題

  • 3秒以内にレスポンスしないとエラーになる
    • コールドスタートした場合は大抵間に合わない

14

2022/12/17

15 of 16

問題点(2): REST API用ライブラリの不足(?)

  • Discord.js (Node.js用で最もメジャーなライブラリ)で�REST APIを直接叩くのは厳しい (という認識)
    • 型情報が定義されてないので,�axiosとかで叩くのとそんなに変わらない
  • 一応SnowTransferというREST API用ライブラリがある
    • 型情報が定義されてるので嬉しい
    • メジャーではなさそう
      • SnowTransferのスター数: 53
      • Discord.jsのスター数: 21k

15

2022/12/17

16 of 16

まとめ

  • スラッシュコマンド時代の到来により,�サーバーレスでBotを稼働できるようになった
  • とはいえサーバーレスBotには課題もある
    • コールドスタート問題
    • REST API用ライブラリが未確立
  • スラッシュコマンド自体は超便利なので�みんな使っていこうね

16

2022/12/17