はじめに
ご挨拶
こんにちは、みんみんです。
Discord botを自作して4ヶ月間ほどAWS上で常駐させているのですが、本記事執筆時点で0円のまま運用できているのでそのお話です。
AWSを初めて触るのって意外と大変です(料金やサービスの使い方、アカウントの設定etc...)。ドキュメントは豊富にあるとはいえ、自分の求めているものをキャッチアップするのは骨が折れる作業だったりしますよね。
また、Discord botは様々なものが存在していますが、ニーズに100%マッチしているものとなると案外無かったりします。自分で作ろうにも設定とか難しく感じる方も一定数いるのではないでしょうか。
この記事を機に触ってみよう、作ってみよう!って方が増えればいいなと思い自分が作ったものについて書いていきます。
自己紹介
じゃあこの記事書いているのは誰だっていうところで自己紹介です。
- 愛知の情報科大学院生(27卒予定)
- ネットワークの研究室に所属
- インフラエンジニアとして就活中
- インターンで業務に携わったり
作ったDiscord botのリポジトリ→https://github.com/Minmin067/VCNotify
botの作成をしてホスティング環境を用意すれば動きます。自分はAWSのEC2に常駐させています。
対象とする読者層
- AWSを触ってみたい人
- Discord botを作ってみたい人
- 上のリポジトリのbotを使ってみたい人など
制作背景
自身が管理している友人とのDiscordサーバーがあるのですが、ある日こんな会話が。
友人A「ボイスチャット入った時に通知が欲しい」
みんみん「bot追加したよ」
友人A「通知カスタマイズしてほしい、あと深夜は通知しないでほしい」
みんみん「そんなbotない、作るか」
という流れで作ることになりました。ざっくりとしたbotの要件定義は以下の通りです。
- ボイスチャンネル参加時にテキストチャンネルで通知
- 通知には参加したユーザ名を含む
- 特定の時間帯は通知しない
botとしての機能はシンプルです。botを作ったことないのですが調べた限り簡単そうだと感じたので、GPT君と一緒に作っていくことにしました。
設計とか実装とか
そもそもDiscord botって?
Discordには第三者が公開している様々なbotが存在します。サーバー管理者は自身のサーバーにbotを追加することでbotを利用することができます。また、公式でdevelopersが用意されており、ここからAPIを利用したアプリケーション(bot)を作成することもできます。
https://discord.com/developers/docs/intro
この時点で私は「作って設定すればいいんだ~」って思っていましたが、見落としがありました。冷静に考えれば当たり前の話ではあるのですが、Discordのbotには動作させるプラットフォームが存在していないので、常駐させるホスティング環境が必要ということです。Dockerコンテナ上で動かすにしても、コンテナホストとしてPCを起動し続けるのは電気代の面や、自身のPC自体のメンテナンス中に止めたりという問題があるためホスティングをどうするかを考えました。
AWSのEC2
ここで行き着いたのがAWSのEC2です。幸いにもちょっと前にAWSを触り始めたので、無量枠で動かせるのではと考えました。(経緯となったインターンの記事はこちら)
EC2上でコンテナとして稼働させれば、ホスティング環境の問題は解決です。
botを作ってみる
概ね設計もできてきたところで作っていきます。
とはいえ、まずはbot自体を作らないことにはコードを書いてもトークンの発行や権限の付与を設定できないため、動作させることができません。
1.アプリの作成
Discord Developer Portalを開いてNew Applicationからアプリを作ります。アプリ名はわかりやすいものでいいと思います。(botのユーザー名ではないので注意)
2.トークンの取得
作成したアプリ内でメニューからbotを選択します。
Reset Tokenを押すとTokenが表示されるのでプロジェクトファイルの.envに記入します。
トークンは絶対外部に漏らさないようにしてください。
注意
トークンをGitHubなどにそのままpushすると即BANされる可能性があります。
開発するときは.gitignore で .env を除外しておくのを忘れずに。
3.招待リンクと権限周り(IntentとかBot permissionとかOAuth2)の話
トークンの下の方にIntentやBot Permissionの設定があります。
インテントに関しては基本スルーで進めます。(botを100以上のサーバーに登録するなら関わってくる話ですが、今回は自分のサーバのみで完結させるので。)
Bot Permissionは用途に合わせて必要なものだけを有効にしましょう。
過剰な権限の付与は思わぬ挙動を起こしかねないので、作成したいbotに必要な権限のみに絞りましょう。
今回のVC NotifyはView ChannelsとSend Messagesのみ付与します。
招待方法はちょっとややこしい話があるのですが、自分は以下の手順で作成しました。
-
ClientIDを取得
- メニューから
OAuth2を選択 - クライアントID(数字の羅列)があるのでメモ
- メニューから
-
必要な権限ビットを決める
- メニューから
Botに戻る - Bot Permissionsで必要な権限にチェック
- 下部に権限の組み合わせによって一位の整数が生成されるのでメモ
- 例:
Send Messages+View Channels→ 権限ビットは3072
- メニューから
-
下記の形式でブラウザに貼り付け、アクセス
https://discord.com/oauth2/authorize ?client_id=YOUR_CLIENT_ID &scope=bot &permissions=PERMISSIONS_INTEGER例
https://discord.com/oauth2/authorize?client_id=123456789012345678&scope=bot&permissions=3072 -
Botを招待
- 表示される画面で招待したいサーバーを選択して招待して完了
色々と調べたりしましたが自分も正直ここら辺の話は詳しくないです。
特にこだわりがなければ上記の手順でできます。
4.Botの確認
サーバーに招待できたら、メンバー一覧にBotの名前が表示されるはずです。
まだコードを動かしていないのでオフライン状態ですが、ここまででBotの登録と認証準備は完了です。
5.コード書く
今回はGoで書きました。理由としてはdiscordgo (https://github.com/bwmarrin/discordgo) があるのと、運用コストの面で優れていると判断したからです。
Go側での処理はボイスチャンネルのステータス確認して、参加時のみテキストを送るシンプルな処理です。
自分のbotを使う方は.env.exampleを元にトークンやチャンネルID、通知時刻などを指定してください。
ここまで作成したところで手元のPC上でDockerコンテナを動作させてみると・・・

動いたー!🎉
後はEC2上で動かすだけです!
EC2で動作させる
手元で動作するもの作れたのでここからEC2上で動作させていく話に入るのですが、その前に少しEC2自体と関連するサービスについての軽い説明をします。(すでに分かりやすい記事はいっぱいあるとは思いますが)
EC2ってなんだ
正式名称は「Amazon Elastic Compute Cloud」です。
ざっくり言うと「クラウド上にある自分だけのPC」みたいなイメージが一番近いです。
AWSが提供している仮想マシンのサービスで、好きなOSを選んで、ネット越しにログインして操作できます。
普通PCを24時間つけっぱなしにすると電気代やら発熱やらで大変ですが、EC2なら常時稼働してくれるので、Botみたいな「ずっと動かしておきたいプログラム」にぴったり。
しかもAWSには「無料利用枠」があって、t2.micro / t3.micro と呼ばれる小さめのインスタンスなら1年間タダで動かせます。(私もこのBotはずっと無料枠で運用しています)
AWSアカウントを作る
当然の話ではありますが、アカウントの作成が必要です。
メールアドレス・支払い情報(クレカ)を入れるだけでOK。
料金は無料枠の範囲なら一切かからないので安心してください。(自分はこのbotともう一つbotを運用していますが現時点で料金は発生していないです)
中にはAWSはコストが発生してからがチュートリアルという恐ろしい話も耳にしますが・・・
IAMってなに?
AWSには「IAM(Identity and Access Management)」というユーザーと権限を管理する仕組みがあります。
最初に作った「rootユーザー」はなんでもできるアカウントなので、普段の操作はIAMユーザーを作って行うのが安全です。
ざっくり言うと
- root:マスターキーを持つ神様アカウント
- IAMユーザー:普段使い用の安全なアカウント
今回はBotを動かすだけなので、特別なIAM設定は不要です。コンソール操作もrootユーザーで問題ないと思います。
(本格的に使うようになったらIAMをちゃんと触るぐらいでいいと思います)
EC2インスタンスを立てる
続いて、Botを動かすためのサーバー(EC2)を用意します。
- AWSマネジメントコンソールにログイン
- サービス一覧から「EC2」を選択
- 「インスタンスを起動」ボタンをクリック
- OSは「Ubuntu 22.04 LTS」あたりを選択
- インスタンスタイプは「t2.micro」または「t3.micro」(自分はt2.microを使用)
- 「キーペアの生成」を押して.pemファイルをダウンロード
- セキュリティグループの設定で ポート22(SSH) を開けておく
起動が終わると、「パブリックIPv4アドレス」が表示されるので、それが自分の“クラウドPC”の住所になります。
SSH接続する
ローカル環境(MacやWSL)から、さっきの.pemファイルを使って接続します。
chmod 400 your-key.pem
ssh -i your-key.pem ubuntu@<EC2のパブリックIP>
ログインできれば成功です。これでクラウド上に自分専用のLinuxマシンが立ち上がりました。以降の操作は全部ここ(EC2の中)で行います。
リポジトリ持ってくる
後はEC2インスタンスでgit入れてリポジトリ持ってきたりDocker,Docker-compose入れたりして実行させておくだけです!
CI/CDとかちゃんと書いたことなかったのですが、GPT君に指示を仰ぎながら書いてmainにマージしたらEC2上で最新のコンテナイメージを取得するようにしました。
利用料金の確認
無料とは言われてもやっぱりコストは気になるものですよね。
AWSには利用料金を確認するサービスもあります。Billing and Cost Managementというサービスを選択してみると、自分の使用したサービスが可視化されます。

確認するとちゃんと0$ですね。予算をオーバーしたら通知する設定もできるので、自分は1$超えたら通知するようにしています。
まとめ
長くなりましたが、「Discord Botを自作してAWS無料枠で常駐運用する」というところまで一通り解説できました。
実際にやってみて「思っていたよりも、ちゃんと無料でできるし、ちゃんと動く。」と感じました。
Botを作るのも、AWSを使うのも最初はちょっと怖いけど、一度動かしてみると
「仕組みがわかる → カスタマイズできる → 愛着が湧く」
みたいな好循環が生まれます。
特に今回はGoとDockerを組み合わせたことで、軽量で安定したBotをほぼノーメンテで回せるようになりました。
CI/CDも整えたことで、GitHubにpushするだけで自動反映できたので、クラウド環境での運用の入り口としてはかなり良い題材だったと思います。クラウドやインフラの勉強にもつながるし、ちょっとした「自分の作ったものが動いてる実感」を味わえるのも楽しいポイントです。リクエストしてくれた友人からも好評でした。
今回の記事を通して、「自分でもBot作ってみようかな」とか、「AWS触ってみてもいいかも」と思ってもらえたら嬉しいです。ここまで読んでいただきありがとうございました!
今回作ったDiscord botのリポジトリはこちら→https://github.com/Minmin067/VCNotify