チャットシステムを使った個人開発を続けていると、Discord Botの数はいつの間にか増えていく。
通知用、応答用、そして今回新しく作ったサービス用と、気づけば同じVPS上で複数のBotが動くようになっていた。
複数運用に切り替えるタイミングで3つハマったので、同じ状況になりそうな人向けに整理しておく。
Tomoya意外とハマりやすいポイントになるかもしれないので、
自分用にもここに記録しておく意味で書いていきます。
2つの前提知識
Discordサーバーの中で、自動的にメッセージを送ったり、コマンドに反応したりするプログラムのことだ。
人間のユーザーと同じように「Bot専用のアカウント」としてサーバーに参加し、常にDiscordのサーバーと接続を保ちながら動いている。
Node.jsで作ったプログラムを、VPS上で「落ちても自動的に再起動する」形で動かし続けるためのツール。
個人開発でVPSを使う場合、ほぼ必須の存在になる。
この記事のトラブルも、pm2でBotを常駐化させる過程で発生したものだ。
罠①:Botトークンの使い回しによる衝突
最初、新しいBotのために新しくDiscordアプリケーションを作らず、既存のBotトークンをそのまま使い回そうとした。
同じトークンで別々のプロセスがDiscord Gatewayに接続すると、セッションが競合し、片方の機能が正常に動かなくなることがある。
Tomoya今回は、新しく追加したサービスの通知が、既存Botの処理に埋もれて機能しなかった。
サービスを追加するたびに、Discord Developer Portalで新しいアプリケーションを作り、専用のBotトークンを発行するのが安全だ。
サーバーやチャンネルは共用していい。競合するのはBotの「中身」の方だ。
罠②:pm2のexec_modeの設定漏れ
そもそもcluster modeとfork modeの違い
- fork mode :
-
プログラムを1つだけ、そのまま起動する。シンプルな動作
- cluster mode :
-
Node.jsの機能を使って、同じプログラムを複数同時に起動する。
主に、大量のアクセスを複数のCPUコアで分散処理したいWebサーバーなどで使われる
pm2でBotを常駐化する際、ecosystem.config.cjsにexec_modeを明示していなかったところ、意図せずclusterモードで起動してしまっていた。
nano ecosystem.config.cjs // 編集エディタ
module.exports = {
apps: [{
name: "my-bot",
script: "src/bot.js",
exec_mode: "fork", // 明示しておく
instances: 1,
autorestart: true,
}]
};Discord Botのように「1本の接続を常に保つ」タイプのプロセスは、clusterモードには向いていない。
複数インスタンスが起動すると、同じトークンで複数のGateway接続が発生したり、定期処理が重複実行されたりするリスクがある。
exec_mode: "fork"は明示しておいた方がいい。
設定を直した後は、pm2 deleteしてからpm2 startし直すと確実に反映される。
Tomoyaセーブした後に、再起動は忘れずに

罠③:DiscordのID種類の混同

Tomoyaここはホントに毎回悩みます。。。
Discordには似たような役割のIDがいくつも存在する。
| ID | 用途 | 取得方法 |
|---|---|---|
| チャンネルID | 通知の送信先を指定 | チャンネルを右クリック→IDをコピー |
| Bot Application ID | Botアプリ自体の識別子(開発者ポータル) | Developer Portalのアプリ情報ページ |
| ユーザーID | 特定ユーザーへの権限制御など | ユーザーを右クリック→IDをコピー |
| サーバー(Guild)ID | スラッシュコマンドの即時反映など | サーバーアイコンを右クリック→IDをコピー |
チャンネルIDとBot Application IDは、どちらも似たような桁数の数字なので混同しやすい。実際、自分もここで一度ハマった。
通知が届かない場合、まず疑うべきはこの取り違えだ!!
まとめ

複数のBotを1台のVPSで運用する時のポイントは
「サーバー・チャンネルは共用していいが、Botアプリケーションはサービスごとに分ける」
これに尽きる。
IDの取り違えも含めて、最初の1回さえ乗り越えれば、次からは同じ手順の繰り返しになる。
▼ Discord Botを活用した記事とそのシリーズ ▼

①:テーマ選定

②:基盤構築(土台作り)

③:実装編(MVP)

④:VPSに反映(MVP)

⑤:VPS上である意味の為に機能追加(発展)


コメント
コメント一覧 (1件)
[…] pm2×Discord Bot、複数運用で実際にハマった3つの罠 1台のVPSで複数のDiscord […]