【AWS】Discord の BOT つくってみた

こんにちは、しましまです。

前回の記事で AWS の Lambda を学習しました。
今回はその学びを活かして、Discord の BOT を作成してみました。

今回作ったモノ

AWS の学習用に、一問一答形式の問題を出題する Discord BOT を作ってみました。

以下の画像は、実際に作成して現在も利用中の BOT の画面です。

主な仕様としては以下のとおりです。

  • 毎日 8 時間ごとに自動で問題を送信
  • ランダムな 4 問を出題
  • 回答はマスク(非表示)形式で送信

使用したサービス

今回使用した AWS のサービスは以下の 2 つです。

  • Amazon EventBridge
  • AWS Lambda

Amazon EventBridge について

EventBridge は、システム内外のサービスが発する「イベント(出来事)」をトリガーとして受け取り、他の処理へ自動的に連携できるサービスです。

今回は、「毎日 8 時間ごとに問題を送る」という仕様を実現するために使用しました。

スケジュールは cron 式で設定でき、今回は次のように指定しました。

  • 0時(9:00 JST)
  • 8時(17:00 JST)
  • 16時(1:00 JST)

(※ EventBridge の時刻は UTC 基準であるため、JST では +9 時間となります。)

これにより、上記の時刻に Lambda 関数 が呼び出されるように設定しています。

AWS Lambda について

処理は Node.js で記述しました。

(※ インポート部分や問題生成ロジックは今回省略します)

// ・・・インポート部分省略 ・・・
export async function handler(event) {
  console.log("処理開始");
  const webhookUrl = process.env.WEBHOOK_URL;
  createQuestion();
  const data = formatForDiscord(questionList);
  console.log("問題生成完了");
  const url = new URL(webhookUrl);
  const options = {
    hostname: url.hostname,
    path: url.pathname + url.search,
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Content-Length": Buffer.byteLength(data),
    },
  };

  return new Promise((resolve, reject) => {
    const req = https.request(options, (res) => {
      res.on("data", () => {});
      res.on("end", () => resolve("✅ メッセージ送信完了"));
    });
    req.on("error", (e) => reject(e));
    req.write(data);
    req.end();
  });
};

// ・・・問題作成部分省略 ・・・

EventBridge によってこの handler 関数が定期的に実行され、Discord の BOT にメッセージが送信されます。

今回のように、Webhook URL を環境変数で管理しているため、セキュリティ面でも安心です。

おわりに

今回は、自分用の Discord BOT を作ってみました。
AWS のサービスを使えば、気軽にサーバー連携の処理を構築できるので、開発のハードルがぐっと下がると感じました。

リアルタイム応答型の BOT とは違い、常時稼働が必要ない仕組みだったため、EventBridge と Lambda の組み合わせが非常に有効でした。

こうした経験を通じて、AWS を使ってできることの幅が広がった実感があります。

また新しいことができたら、このブログで共有していきます!