本文へスキップ

2026年6月23日

Cloudflare WorkersでDiscord Botをサーバーレスで動かす — バイブコーディング実践ガイド

CommunityDiscordEngineeringAI

なぜ「サーバーを立てない」選択肢が今のスタンダードなのか

Discord Bot・APIで何ができるのかで触れたように、自作Botを動かすにはホスティング(動かし続ける環境)が必要です。従来はVPSやDockerコンテナを常時起動していましたが、このアプローチには3つの問題がありました。

  1. コスト:月額数百〜数千円のサーバー料金が継続的にかかる
  2. 運用:サーバーの監視・更新・再起動を管理しなければならない
  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 も含めて一式

コード全体と、初回デプロイ手順(コマンド叩く順序)を教えてください。

受け取ったコードを実際にデプロイする手順は:

  1. npm create cloudflare@latest でプロジェクトを作成
  2. Discordデベロッパーポータルでアプリを作成し、Public Key・Application ID・Bot Tokenを取得
  3. wrangler secret put DISCORD_PUBLIC_KEY でシークレットを設定
  4. wrangler deploy でデプロイし、発行されたURLをDiscordの「Interactions Endpoint URL」に設定
  5. スラッシュコマンドを登録(一度だけ実行するスクリプト 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ワード・レート制限・エラーハンドリングも確認するとより堅牢になります。