【Python】Claude API搭載の自作AIエージェントをVPSで24時間常時稼働させる開発・デプロイ手順

近年、LLM(大規模言語モデル)の進化により、個人のタスク管理やコミュニティ内のコミュニケーションを自動化・高度化する「AIエージェント」の開発が注目を集めています。中でもAnthropic社のClaude APIは、その高度な推論能力と自然な会話表現から、開発者の間で高い人気を誇っています。

本記事では、Pythonを用いてClaude APIを組み込んだDiscord Bot(AIエージェント)を開発し、それを仮想専用サーバー(VPS)環境へデプロイして「24時間365日」安定して常時稼働させるための具体的な手順を解説します。


1. システムの全体像と前提条件

今回構築するシステムの全体構成は以下の通りです。

  • インターフェース: Discord(discord.py を使用)
  • AIバックエンド: Anthropic Claude API(claude-3-5-sonnet モデルを使用)
  • 稼働環境: Linux VPS(Ubuntu 22.04 LTS)
  • プロセス管理: systemd によるバックグラウンド永続化および自動再起動制御

開発にあたって必要なもの

  1. Discord Botのトークン: Discord Developer Portalから取得します。
  2. Anthropic APIキー: Anthropicのコンソールからアカウントを作成し取得します。
  3. VPS(仮想専用サーバー): 外部から常時アクセス・起動を維持するために必須です。

2. 開発フェーズ:PythonによるClaude API搭載Botの実装

まずはローカル環境で動作するBotのコアロジックを実装します。ここでは、非同期通信ライブラリである discord.py と、公式の Anthropic Python SDK(または anthropic パッケージ)を使用します。

必要ライブラリのインストール

プロジェクト用のディレクトリを作成し、必要なパッケージをインストールします。環境の依存関係を隔離するため、仮想環境(venv)の利用を強く推奨します。

mkdir claude-discord-bot
cd claude-discord-bot
python3 -m venv venv
source venv/bin/activate

pip install discord.py anthropic python-dotenv

Discord Botコードの実装

次に、Botのメインプログラムとなる bot.py を作成します。以下のコードは、Discord上でメンションされた際にClaude APIを呼び出し、思考を巡らせた回答を返すエージェントの基本形です。

import os
import discord
from discord.ext import commands
from anthropic import Anthropic
from dotenv import load_dotenv

# 環境変数の読み込み
load_dotenv()

DISCORD_TOKEN = os.getenv("DISCORD_TOKEN")
ANTHROPIC_API_KEY = os.getenv("ANTHROPIC_API_KEY")

if not DISCORD_TOKEN or not ANTHROPIC_API_KEY:
    raise ValueError("環境変数 DISCORD_TOKEN または ANTHROPIC_API_KEY が設定されていません。")

# Discord Botの初期化
intents = discord.Intents.default()
intents.message_content = True
bot = commands.Bot(command_prefix="!", intents=intents)

# Anthropicクライアントの初期化
claude_client = Anthropic(api_key=ANTHROPIC_API_KEY)

@bot.event
async def on_ready():
    print(f"Logged in as {bot.user.name} (ID: {bot.user.id})")
    print("------")

@bot.event
async def on_message(message):
    # Bot自身のメッセージは無視
    if message.author == bot.user:
        return

    # メンションされた場合、またはダイレクトメッセージの場合に応答
    if bot.user.mentioned_in(message) or isinstance(message.channel, discord.DMChannel):
        async with message.channel.typing():
            try:
                # 送信されたテキストからBotのメンションを取り除く
                prompt = message.content.replace(f'<@!{bot.user.id}>', '').replace(f'<@{bot.user.id}>', '').strip()
                
                if not prompt:
                    await message.reply("何か質問してください!")
                    return

                # Claude APIの呼び出し (非同期スレッドプールで非ブロッキング実行)
                response = claude_client.messages.create(
                    model="claude-3-5-sonnet-20240620",
                    max_tokens=1000,
                    system="あなたは優秀で親切なAIアシスタントです。フレンドリーに日本語で回答してください。",
                    messages=[
                        {"role": "user", "content": prompt}
                    ]
                )
                
                # 回答の送信
                reply_text = response.content[0].text
                # Discordの文字数制限(2000文字)対策
                if len(reply_text) > 2000:
                    reply_text = reply_text[:1990] + "...(長文のため省略)"
                    
                await message.reply(reply_text)
                
            except Exception as e:
                print(f"Error during API call: {e}")
                await message.reply("申し訳ありません、処理中にエラーが発生しました。")

    await bot.process_commands(message)

if __name__ == "__main__":
    bot.run(DISCORD_TOKEN)

このコードをローカル環境で実行し、環境変数(.envファイルなど)を正しく設定すれば、Discord上でメンションに対してClaudeが返答を返すようになります。


3. インフラ選定:なぜVPSが必要なのか?

開発したAI Botを自分のPCで動かし続ける場合、PCのスリープ設定の変更、電気代、ネットワークの切断といった課題が常に付きまといます。24時間安定稼働させるためには、クラウド上の仮想サーバー(VPS)の利用が不可欠です。

VPSは固定IPアドレスが割り当てられ、稼働率が非常に高いため、Discord Botのような常時接続が求められるシステムに最適です。

ConoHa WINGでブログを立ち上げる

⚡ 初期費用無料・ドメインが2個無料


4. 構築フェーズ:VPS環境のセットアップとデプロイ

ここからは、準備したVPS(Ubuntu 22.04 LTS)にBotをデプロイし、常時稼働させる手順を解説します。

VPSの基本設定

まずはVPSにSSHでログインし、システムを最新の状態に更新します。

sudo apt update && sudo apt upgrade -y

Python環境の構築と依存パッケージの導入

Ubuntuに標準インストールされている Python 3pip、および仮想環境パッケージを準備します。

sudo apt install python3-pip python3-venv git -y

次に、プロジェクトを配置するディレクトリを作成し、GitHubなどを経由してコードを転送するか、直接ファイルを編集して bot.py を配置します。

mkdir -p ~/apps/claude-bot
cd ~/apps/claude-bot
# ここで bot.py を作成/配置

環境設定用ファイル .env を作成します。

nano .env
DISCORD_TOKEN=your_discord_bot_token_here
ANTHROPIC_API_KEY=your_anthropic_api_key_here

仮想環境の構築と依存関係のインストールをVPS上でも実行します。

python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

(注: ローカル環境で pip freeze > requirements.txt を実行しておき、それをVPS側へ持っていくとスムーズです)

Discord Botの常時稼働(systemdによるサービス化)

コンソールを閉じてもBotが終了しないように、またVPSが再起動した際にも自動でBotが立ち上がるように、Linuxの systemd を使ってサービス化します。

以下のコマンドで設定ファイルを作成します。

sudo nano /etc/systemd/system/claude-bot.service

ファイル内に以下の内容を記述します(ユーザー名 ubuntu やパスは自身のVPS環境に書き換えてください)。

[Unit]
Description=Claude Discord Bot Agent
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/apps/claude-bot
ExecStart=/home/ubuntu/apps/claude-bot/venv/bin/python bot.py
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=claude-bot

[Install]
WantedBy=multi-user.target

保存後、systemdのリロードを行い、サービスを有効化・起動します。

# 設定ファイルの再読み込み
sudo systemctl daemon-reload

# サービスを起動
sudo systemctl start claude-bot

# 自動起動(OS再起動時)の有効化
sudo systemctl enable claude-bot

以下のコマンドで、ステータスが active (running) になっているか確認します。

sudo systemctl status claude-bot

これで、VPS上での24時間常時稼働環境が整いました。


5. トラブルシューティング:よくあるエラーと解決策

VPS上でBotを構築する際に遭遇しやすいトラブルとその解決方法をまとめました。

discord.errors.PrivilegedIntentsRequired エラーが発生する

原因: discord.py の仕様変更により、メッセージ内容を取得するために「Message Content Intent」の明示的な許可が必要になりました。コード上で intents.message_content = True を指定していても、Discordの開発者ポータル側で許可がされていないとこのエラーが発生します。

解決策:

  1. Discord Developer Portal にアクセス。
  2. 該当するアプリケーション(Bot)を選択し、左メニューから「Bot」をクリック。
  3. 「Privileged Gateway Intents」セクションまでスクロールし、「MESSAGE CONTENT INTENT」をオン(有効)にして保存します。

APIConnectionError またはネットワークタイムアウト

原因: VPSのファイアウォール設定(UFWなど)やセキュリティグループによって、外部へのアウトバウンド(送信)通信、もしくは特定のポートが閉じられている場合に発生します。

解決策: 通常、Discord BotやClaude APIへのリクエストはHTTPS(ポート443)経由のアウトバウンド通信です。VPSのUFW設定を確認し、アウトバウンドが制限されていないか確認してください。

# UFWのステータス確認
sudo ufw status

通常、初期設定ではアウトバウンドは許可されていますが、インバウンド(受信)で不要なポートが開いていないかもセキュリティのために併せて確認しておきましょう。

③ プロセスが意図せず停止しており、自動復帰しない

原因: メモリ不足(OOM Killerによる強制終了)や、API接続のタイムアウト時にPythonスクリプトが例外処理しきれずにクラッシュし、そのままサービスが停止している可能性があります。

解決策: 先ほど設定した systemd サービス設定内の Restart=always および RestartSec=10 が正しく記述されているか再確認してください。これにより、プログラムが異常終了しても10秒後に自動的にシステムがプロセスを再起動します。また、journalctl コマンドを使ってエラーログを確認できます。

# リアルタイムでBotのログを確認する
sudo journalctl -u claude-bot -f

6. まとめ

本記事では、PythonとClaude APIを組み合わせたAIエージェントDiscord BotをVPS上で永続的に稼働させる方法を解説しました。

単なる返答Botに留まらず、Claudeのツール利用機能(Function Calling)などを組み込むことで、「Githubと連携したデプロイ監視Bot」や「カレンダーと連携したタスク管理Bot」など、独自の自律型エージェントへと容易に進化させることができます。ぜひVPS上に自分専用の頼れる相棒を構築してみてください。