こんにちは、しましまです。
前回の記事で 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 を使ってできることの幅が広がった実感があります。
また新しいことができたら、このブログで共有していきます!