2026年6月23日
Cloudflare WorkersでDiscord Botをサーバーレスで動かす — バイブコーディング実践ガイド
なぜ「サーバーを立てない」選択肢が今のスタンダードなのか
Discord Bot・APIで何ができるのかで触れたように、自作Botを動かすにはホスティング(動かし続ける環境)が必要です。従来はVPSやDockerコンテナを常時起動していましたが、このアプローチには3つの問題がありました。
- コスト:月額数百〜数千円のサーバー料金が継続的にかかる
- 運用:サーバーの監視・更新・再起動を管理しなければならない
- スケール:バースト時(大規模イベント等)に耐えられるよう余分なスペックを持つ必要がある
Cloudflare Workersのサーバーレス方式はこれらを一気に解決します。コードはCloudflareのエッジCDN(世界300か所以上)で、リクエストが来たときだけ実行されます。Discordがコマンドを叩くたびにWorkerが起動し、応答したら終了する——この「使い捨て実行」が低コスト・低運用の源泉です。
Interactions Endpoint方式とGateway方式の違い
Discordには2種類のBot実装アーキテクチャがあります。
| 項目 | Gateway方式(WebSocket) | Interactions Endpoint方式(HTTP) |
|---|---|---|
| 通信 | WebSocketで常時接続 | HTTPリクエストを待ち受け |
| 実行環境 | 常時起動のサーバーが必要 | サーバーレス可(Cloudflare Workers等) |
| イベント種類 | 全イベントを受信(メッセージ・リアクション等) | スラッシュコマンドなどのインタラクションのみ |
| 向く用途 | リアクション監視・全発言を処理するBot | コマンド応答・ボタン・モーダルを中心とするBot |
| コスト感 | 常時起動のため固定費 | リクエスト数ベースで実質無料枠内 |
ルームの全発言を監視・収集するようなBotはGateway方式が必要ですが、コマンドで操作させる・ボタンを押させる・フォームを受け取るといった大半の運営自動化ニーズはInteractions Endpoint方式で賄えます。
実装の全体像
Cloudflare Workers + Discord Botの構成は以下のようになります。
ユーザーが /hello を実行
→ Discord がWorkerのURLにPOSTリクエスト
→ WorkerがEd25519署名を検証(セキュリティ)
→ WorkerがJSON形式でEmbedを返却
→ Discordがレスポンスを表示
署名検証はDiscord公式のセキュリティ要件です。必ず実装してください(discord-interactions ライブラリが処理を担います)。
コード例:スラッシュコマンドに応答するWorker
// src/index.ts
import {
InteractionResponseType,
InteractionType,
verifyKey,
} from 'discord-interactions';
export default {
async fetch(request: Request, env: Env): Promise<Response> {
if (request.method !== 'POST') {
return new Response('Method not allowed', { status: 405 });
}
// Ed25519 署名検証
const signature = request.headers.get('x-signature-ed25519') ?? '';
const timestamp = request.headers.get('x-signature-timestamp') ?? '';
const body = await request.text();
const isValid = await verifyKey(body, signature, timestamp, env.DISCORD_PUBLIC_KEY);
if (!isValid) {
return new Response('Bad request signature', { status: 401 });
}
const interaction = JSON.parse(body);
// Ping(Discord の死活確認)に応答
if (interaction.type === InteractionType.PING) {
return Response.json({ type: InteractionResponseType.PONG });
}
// スラッシュコマンドの処理
if (interaction.type === InteractionType.APPLICATION_COMMAND) {
const { name } = interaction.data;
if (name === 'hello') {
return Response.json({
type: InteractionResponseType.CHANNEL_MESSAGE_WITH_SOURCE,
data: {
embeds: [
{
title: 'こんにちは!',
description: 'Cloudflare Workers上で動いているDiscord Botです。',
color: 0x5865f2, // Discord Blurple
},
],
},
});
}
}
return new Response('Unknown interaction', { status: 400 });
},
};
interface Env {
DISCORD_PUBLIC_KEY: string;
}
wrangler.toml の設定例:
name = "my-discord-bot"
main = "src/index.ts"
compatibility_date = "2024-11-01"
シークレット(DISCORD_PUBLIC_KEY)は wrangler secret put DISCORD_PUBLIC_KEY コマンドで設定します。
バイブコーディングでの作り方
このBotをゼロから実装する場合、専業エンジニアでなくてもAIコーディング(Claude等)を使えば実現できます。以下のプロンプトがテンプレートになります。
Discord BotをCloudflare WorkersのInteractions Endpoint方式で作りたいです。
要件:
- TypeScript で実装
- スラッシュコマンド /welcome に反応して、Embedでウェルカムメッセージを返す
- Ed25519署名検証を含む
- discord-interactions ライブラリを使う
- wrangler.toml と package.json も含めて一式
コード全体と、初回デプロイ手順(コマンド叩く順序)を教えてください。
受け取ったコードを実際にデプロイする手順は:
npm create cloudflare@latestでプロジェクトを作成- Discordデベロッパーポータルでアプリを作成し、Public Key・Application ID・Bot Tokenを取得
wrangler secret put DISCORD_PUBLIC_KEYでシークレットを設定wrangler deployでデプロイし、発行されたURLをDiscordの「Interactions Endpoint URL」に設定- スラッシュコマンドを登録(一度だけ実行するスクリプト or Discord Developer Portalで登録)
コマンド登録スクリプトもAIに書いてもらうと効率的です。
ユースケース例:コミュニティ運営での活用
| ユースケース | スラッシュコマンド例 | 処理内容 |
|---|---|---|
| ルール確認 | /rules | チャンネル固有のルールをEmbedで返す |
| FAQボット | /faq キーワード | キーワードに対応した回答をEmbedで返す |
| 申請受付 | /apply | モーダル(フォーム)を出して申請を受け取る |
| スケジュール案内 | /next-event | 次回イベントの日時と概要を返す |
| LLM応答 | /ask 質問文 | Claude APIを呼んで回答を返す(要遅延応答) |
遅延応答の注意点: Cloudflare Workersは最大10分のCPU時間制限があり、LLM API呼び出しのような処理はWorker内で完結します。ただし、DiscordのInteractionsは3秒以内に初回レスポンスが必要なため、LLM連携は「まず「考え中…」と返し、後からWebhookで更新する」遅延応答パターンが必要です。
既製BotとCloudflare Workers自作の使い分け
Discordコミュニティの作り方でも触れたように、まずは既製Botで試し、固有ニーズが出てきたら自作に移行するのが堅実です。
| 判断軸 | 既製Botを選ぶ場合 | Cloudflare Workers自作を選ぶ場合 |
|---|---|---|
| 機能の汎用性 | MEE6・Carl-botで十分な汎用機能 | 自社業務フロー・独自ルール |
| データの保持 | 外部サービス管理でよい | 自社でログ・データを持ちたい |
| コスト感 | 既製Botの月額料金を許容できる | 無料〜低コストで収めたい |
| 技術リソース | エンジニア不在 | バイブコーディングで実装できる |
まとめ
- Cloudflare WorkersのInteractions Endpoint方式で、常時起動のサーバーなしにDiscord Botを動かせます
- 無料枠(1日10万リクエスト)で1000人規模のコミュニティ運営に十分対応できます
- コマンド応答・ボタン・モーダルが中心の運営自動化はこの構成で完結します
- バイブコーディング(AIコーディング)で、専業エンジニアでなくても実装できます
- LLM連携は遅延応答パターンが必要で、これもAIに設計してもらえます
Discord BotやSlack Botの内製支援、コミュニティの自動化設計に関心があれば、六瀬のコミュニティ開発サービスもご覧ください。要件整理からバイブコーディング伴走まで対応します。
関連記事
Contact · 六瀬合同会社
コミュニティの話を、続けませんか。
読みながら「自分のところはどうなんだろう」と思った瞬間があれば、その問いをそのまま送ってください。整理されていなくても、相談の入口を一緒に言葉にしていきます。
よくある質問
- Q. Discord BotをCloudflare Workersで動かすと何が変わりますか?
- A. 常時起動のサーバーが不要になります。Cloudflare WorkersはリクエストごとにコードがエッジCDNで実行される仕組みで、Discordがインタラクション(スラッシュコマンドの実行など)をHTTPでWorkerのURLに送り、WorkerがそれをJSON形式で返します。サーバーを立てて起動し続けるGateway方式と比べ、コストがほぼゼロ(無料枠で十分)になり、運用負荷も格段に下がります。
- Q. Cloudflare Workersの無料枠でどのくらいのリクエストをさばけますか?
- A. 無料プランで1日あたり100,000リクエストまで無料です。1000人規模のコミュニティでスラッシュコマンドを使っても、通常はここに収まります。リクエスト数が増えた場合でも、Workers有料プランは月$5から(1,000万リクエストまで)と、専用サーバーに比べて大幅に安価です。
- Q. バイブコーディングでBotを作るとき、何をAIに伝えればいいですか?
- A. 「Discord BotをCloudflare WorkersのInteractions Endpoint方式で作りたい。スラッシュコマンド /hello に反応してEmbedで挨拶を返す。TypeScriptで書いてください。discord-interactionsライブラリを使う実装例と、wrangler.tomlの設定もセットで教えてください。」のように、プラットフォーム・方式・コマンド名・返答形式・使用ライブラリを具体的に伝えるのが効果的です。コードを受け取ったら、NGワード・レート制限・エラーハンドリングも確認するとより堅牢になります。