当サイトにはアフィリエイト広告が含まれます。なおレビューは私の感想を書いており、内容を指示するご依頼はお断りしています

Discord AI Bot 開発記:Cloud RunとGASでDiscordでAIが会話するボットを動かす

こんにちは!今回は、全くのゼロからGoogle Cloud Platform (GCP) とDiscord APIを触って、DiscordでAIが会話するボットを動かすまでに至った記録を、備忘録として残しておきたいと思います。

普段、GCPのサービスも名前すら知らなかった私が、ここまで来れたのは本当に奇跡に近いです。特に、Geminiのサポートがなければ絶対に無理でした。この場を借りて、改めて感謝します。Gemini、マジ神。

最終的にこんな感じをAIが送ってくれるようになりました!

(※ 画像はPixAIとIbispaintで作成しています。アニメスタイルのパキッとした感じがスタンプっぽくて気に入ってます!)

それでは、具体的な実装方法をざっと見ていきましょう。


1. 事前準備:GCPとDiscordの設定

まず、動かすための基盤を整えます。

Google Cloud Platform (GCP)

  • GCPアカウントの取得とプロジェクト作成: 当然ですが、まずはGCPアカウントが必要です。
  • APIの有効化: 今回使うサービス(Cloud Build、Cloud Run、必要に応じてCloud Scheduler)のAPIを有効にしておきましょう。
    • Cloud Build API: コードのビルドに使います。
    • Cloud Run API: 作成したサービスをデプロイし、動かすために使います。
    • (もしGASではなくGCP内で定期実行するなら)Cloud Scheduler APICloud Pub/Sub APIも有効化しておきます。

Discordアプリケーションの作成

Discord側でボットを作成し、必要な情報を取得します。

  1. Discord Developer Portal へアクセスし、「New Application」から新しいアプリケーションを作成します。
  2. 「General Information」で、App IconName を設定します。これがDiscord上で表示されるボットのアイコンと名前になります。
  3. 「Bot」タブに移動し、「Add Bot」をクリックしてボットを追加します。
    • ここで表示されるTOKENをコピーしておきましょう!これはボットがDiscord APIと通信するために必要です。絶対に他人に知られないように管理してください。 後で環境変数として設定します。
    • 「Privileged Gateway Intents」の項目で、ボットがメッセージの内容を読み取れるように Message Content Intent を有効にする必要がある場合があります。
  4. 「OAuth2」>「OAuth2 URL Generator」で、ボットに必要な権限(Scopes)にチェックを入れていきます。
    • 最低限「bot」にチェックを入れます。
    • 「Bot Permissions」で、「Read Messages/View Channels」(チャンネルの閲覧・メッセージの読み取り)、「Send Messages」(メッセージの送信)、「Attach Files」(ファイルの添付)などにチェックを入れます。
  5. 「Generated URL」に表示されるURLをコピーし、ブラウザで開きます。サーバー招待画面が表示されるので、ボットを参加させたいサーバーを選択し、許可してください。
  6. ボットを参加させるチャンネルのCHANNEL_IDを控えておきましょう。Discordの開発者モードをオンにして、チャンネルを右クリックすると「IDをコピー」できます。

2. ローカル環境でのコード準備

次に、ローカルPC上でプロジェクトのコードを準備します。

プロジェクト用のフォルダを作成し、その配下に以下のファイルを作成します。

  • Dockerfile: Cloud RunでPythonアプリケーションを動かすための設定ファイル
  • main.py: FastAPIを使ったメインのアプリケーションコード
  • requirements.txt: 必要なPythonライブラリを記述するファイル
  • images/ などの画像フォルダ: スタンプや送信したい画像ファイルを入れておくフォルダ

Dockerfile の例

# Python 3.11 の軽量なイメージを使用
FROM python:3.11-slim

# 作業ディレクトリを設定
WORKDIR /app

# requirements.txt をコピーし、依存関係をインストール
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# その他のアプリケーションファイルをコピー
COPY . .

# FastAPIアプリケーションをUvicornで実行。Cloud RunはPORT環境変数を使用します。
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]

requirements.txt の例

fastapi==0.111.0
uvicorn==0.30.1
PyNaCl==1.5.0
requests==2.32.3
openai==1.35.0

3. GCPへのデプロイと実行

コードの準備ができたら、いよいよGCPへのデプロイを進めていきます。

1. Cloud Buildによるビルド

まず、自分のPCにあるプロジェクトフォルダでコマンドを実行して、作ったDockerイメージをビルドし、Container Registryへプッシュします。

gcloud builds submit --tag gcr.io/{YOUR_GCP_PROJECT_ID}/discord-bot-cloudrun .

このコマンドは、指定したDockerイメージを構築して、Google Cloudのコンテナレジストリにアップロードする役割を持っています。

2. Cloud Runへのデプロイ

次に、GCPコンソールで「Cloud Run」サービスへ移動してください。

  • サービスの作成」ボタンをクリックします。
  • コンテナイメージのURL」欄には、先ほどビルドしたイメージのパスを入力してください。これは、Cloud Runが動かすコンテナの場所を指定するものです。
  • サービス名などの設定を行い、「次へ」をクリックします。
  • とても大事なのが「環境変数の設定」です。ここでDiscordのBotトークン、チャンネルID、OpenAI APIキー、Discordの公開鍵などをしっかり設定してください。これらの変数は、アプリケーションが外部サービスと連携するために不可欠になります。
  • 認証」の項目では、「未認証の呼び出しを許可」を選択してください。この設定をしないと、外部からのAPIリクエストがボットに届きません。
  • 作成」をクリックして、デプロイを実行します。
  • デプロイが終わると、サービスURLが発行されます。このURLは後で使うので、コピーして控えておいてくださいね。

3. GAS (Google Apps Script) を使った定期実行

最後に、ボットを定期的に動かすための設定です。GoogleスプレッドシートなどからGASを開いて、Cloud RunのサービスURLへPOSTリクエストを送るスクリプトを作成します。

作成したGAS関数は、トリガー設定で定期的に実行されるように設定してください。「時間主導型」を選んで、例えば1分ごとや5分ごとなど、動かしたい頻度で設定できます。これにより、指定した間隔でボットの処理が自動的にトリガーされるようになります。


まとめ

ここまでの手順で、Google Cloud Buildでのコンテナイメージのビルド、Cloud Runへのデプロイ、そしてGASを使ったボットの定期稼働の仕組みが完成です。

Cloud Runは、リクエストがないと自動的に停止し、課金が最小限に抑えられるので、安く運用できるのがいいところですね。

今回の経験が、今後DiscordボットやGCPに挑戦する方にとって、役立つ情報となれば嬉しいです。