🩹

本番環境でエラーが発生したときに、ClaudeCodeが勝手に不具合修正する仕組みを作った

に公開

本番環境でエラーが発生したときに、ClaudeCodeが勝手に不具合修正する仕組みを作った

はじめまして
ふっきーです

突然ですが、深夜3時に本番環境でエラーが発生したらどうしますか?
普通は翌朝起きてから対応しますよね

でも、AIが勝手に修正してくれたらどうでしょう?
朝起きたら「エラーを自動修正しました」というメールが届いているんです

今回は、本番環境で発生したエラーをClaudeCodeが完全自動で解析・修正・テスト・デプロイする仕組みを作ったので、その紹介をします

背景

私は定期実行されるバッチ処理システムを運用しています
cronで1日に複数回実行されるジョブがあり、自動でタスクを処理しています

しかし、以下のような問題がありました:

  • 深夜にエラーが発生すると翌朝まで気づかない
  • ファイルが見つからないエラーが時々発生する(開発環境にはあるのに本番環境にない)
  • 手動で修正するのが面倒(本番環境にログイン→原因調査→修正→テスト→デプロイ)

なんとかなりそうだなと思って、ClaudeCodeの自動修正システムを作ることにしました

自動修正システムの内容

このシステムは、本番環境でエラーが発生すると以下のことを完全自動で行います:

  1. エラーを検出・記録する
  2. ClaudeCodeを自動起動する
  3. エラーを解析して根本原因を特定する
  4. 修正を実装する
  5. テストを実行して動作確認する
  6. 成功したらmainブランチにマージしてデプロイする
  7. 本番環境で再実行する
  8. 結果をメールで報告する
  9. それを見て、怒ったり安心したりする

これが実現できると、「深夜3時にエラーが発生→5分後にはAIが修正してデプロイ→処理が再開→朝起きたら修正完了のメールが届いている」 という完全自動復旧が可能になります

ストレスが減るか増えるかは、メールを見てのお楽しみです

システムアーキテクチャ

全体の流れは以下の通りです:

本番環境でエラー発生
    ↓
auto_fix_error.sh を自動起動
    ├─ worktree作成(fix/content-timestamp)
    ├─ tmuxセッション起動
    ├─ ClaudeCode起動
    └─ /auto-fix コマンド実行
        ↓
error-fixer エージェントが作業開始
    ├─ エラー解析
    ├─ 修正実装
    ├─ テスト(DEBUG=True)
    ├─ commit → merge → push
    ├─ 本番環境に反映
    ├─ 本番で再実行(DEBUG=False)
    └─ レポート送信

エラー検出と起動

本番環境のスケジューラー(event_scheduler/scheduler.py)は、エラーが発生すると以下を実行します:

except Exception as e:
    # エラー情報を記録
    error_msg = f"""
    イベント名: {event.name}
    コンテンツクラス: {event.content_class.__name__}
    エラー: {str(e)}
    スタックトレース: {traceback.format_exc()}
    """

    # メール通知
    notifier.send_email(
        subject=f"【エラー】{event.name}",
        body=error_msg
    )

    # 自動修正スクリプトを起動
    subprocess.Popen(
        f"scripts/auto_fix_error.sh {event.name} {content_class} {error} {trace}",
        shell=True
    )

ClaudeCodeの自動起動

auto_fix_error.sh スクリプトは以下を実行します:

#!/bin/bash

# 1. エラー情報を保存
cat > .claude/data/error_info.txt <<EOF
イベント名: $EVENT_NAME
コンテンツクラス: $CONTENT_CLASS
エラーメッセージ: $ERROR_MESSAGE
スタックトレース: $STACK_TRACE
EOF

# 2. ブランチ名生成(例: fix/component-20251024-143000)
BRANCH_NAME="fix/${CONTENT_CLASS}-$(date +%Y%m%d-%H%M%S)"

# 3. worktree作成
git worktree add -b $BRANCH_NAME $DEV_DIR/worktree-$BRANCH_NAME main

# 4. tmuxセッション起動
tmux new-session -d -s auto-fix-$TIMESTAMP -c $DEV_DIR/worktree-$BRANCH_NAME

# 5. ClaudeCode起動
tmux send-keys -t auto-fix-$TIMESTAMP 'claude --dangerously-skip-permissions' Enter

# 6. 初期化待機
sleep 10

# 7. /auto-fix コマンド送信
tmux send-keys -t auto-fix-$TIMESTAMP "/auto-fix" 
tmux send-keys -t auto-fix-$TIMESTAMP Enter

tmuxを使う理由

ClaudeCodeは対話型のCLIツールなので、通常はターミナルで人間が操作します
しかし、スクリプトから自動起動するにはtmux経由でコマンドを送信する必要があります

tmux send-keys を使うことで、対話モードのClaudeCodeに外部からコマンドを送信できるんです

エラー解析と修正

ClaudeCodeのerror-fixerエージェントが以下の手順で作業します:

1. エラー解析

# エラー情報を読み込み
cat .claude/data/error_info.txt

# エラー種類を判定
# - FileNotFoundError
# - ImportError
# - TypeError など

# スタックトレースから根本原因を特定

2. 修正方針決定

システムの破壊を防ぐために、原因が明確でかつ、修正可能な不具合の場合にのみ修正するようにしています。

原因がわからない・修正できない場合は、この時点でレポートを作成し、メールで通知します。

3. 修正実装

# 例: FileNotFoundErrorの場合
cp $DEV_DIR/path/to/file.py path/to/file.py

重要な原則

  • ❌ try-exceptで無視しない
  • ❌ モックやフォールバックを使わない
  • ❌ 代替ファイル・データを使わない
  • ✅ 根本原因を解決する最小限の修正のみ

4. テスト実行

# テストモードで動作確認
python3 -c "
from myapp.processor import TaskProcessor
from myapp.main import run

processor = TaskProcessor(test_mode=True)
run(processor=processor, debug=True)
"

本番環境へのデプロイ

テストが成功した場合のみ、以下を自動実行します:

# 1. コミット
git add .
git commit -m "fix: FileNotFoundError in task processor

本番環境で発生したエラーを自動修正

エラー内容:
- タスク: データ処理バッチ
- コンポーネント: TaskProcessor
- エラー: FileNotFoundError: config.txt

修正内容:
- 開発環境から不足ファイルをコピー

🤖 Generated with Claude Code (Auto Error Fixer)
Co-Authored-By: Claude <noreply@anthropic.com>
"

# 2. mainブランチにマージ
git checkout main
git pull origin main
git merge --no-ff $BRANCH_NAME

# 3. リモートにpush
git push origin main

# 4. 本番環境に反映
cd $PROD_DIR
git pull origin main

# 5. 本番環境で再実行
python3 -c "
from myapp.processor import TaskProcessor
from myapp.main import run

processor = TaskProcessor(test_mode=False)
run(processor=processor, debug=False)
"

レポート送信

詳細なレポートをメール送信します:

from utils.notifier import Notifier

notifier = Notifier()
notifier.send_email(
    subject="【エラー自動修正】データ処理バッチ - 成功",
    body=f"""
    【エラー自動修正レポート】

    エラー情報:
    - タスク: データ処理バッチ
    - エラー: FileNotFoundError: config.txt

    修正内容:
    - 開発環境から不足ファイルをコピー

    テスト結果: ✅ 処理成功
    本番反映: ✅ 完了
    本番再実行: ✅ 完了

    現在の状況:
    - 修正をmainブランチにマージ済み
    - 本番環境に反映済み
    - タスク処理完了

    🤖 Generated with Claude Code (Auto Error Fixer)
    """
)

自動修正のための準備

環境構築

私はOracleCloudの無料枠を使用して、常時稼働のインスタンスを作りました
ClaudeCodeの家になっていてます

ここに以下をインストール:

  • ClaudeCode CLI
  • tmux(セッション管理用)
  • git(worktree管理用)
  • Python環境

カスタムコマンドの定義

.claude/commands/auto-fix.md でカスタムコマンドを定義:

---
description: "本番環境で発生したエラーを自動的に解析・修正し、本番環境に反映する"
allowed-tools: Task
---

# /auto-fix - 自動エラー修正コマンド

!Task(subagent_type="error-fixer", description="Auto fix production error", prompt="
本番環境で発生したエラーを自動修正してください。

エラー情報は `.claude/data/error_info.txt` に保存されています。

以下の手順で進めてください:
1. エラー情報読み込み
2. エラー解析
3. 修正実装
4. テスト実行
5. Git操作(成功時)
6. 本番反映(成功時)
7. 本番再実行(成功時)
8. レポート送信
9. クリーンアップ
")

サブエージェントの定義

.claude/agents/error-fixer.md でエージェントを定義:

---
name: error-fixer
description: 本番環境で発生したエラーを自動的に分析・修正し、本番環境に反映する専門エージェント
tools: Bash, Read, Write, Edit, Glob, Grep, TodoWrite
model: sonnet
---

# Error Fixer Agent

あなたは本番環境で発生したエラーを自動的に分析・修正し、本番環境に反映する専門エージェントです。

## 重要な原則

1. **無理な修正はしない**: 修正できなくても大きな損失はない
2. **フォールバック禁止**: モックやその場限りの修正は絶対にしない
3. **代替の禁止**: 見つからないファイルやデータの代替は使用しない
4. **最小限の修正**: 必要最小限の変更のみを行う

(以下、詳細な手順を記述)

cronでの定期実行

本番環境のスケジューラーはcronで定期実行しています:

# 毎日定期実行
0 */6 * * * cd $PROD_DIR && python3 scheduler.py

エラーが発生すると、自動修正スクリプトが起動します

おわりに

今んところ意外といい感じに動いています
本番環境で発生した不具合をほぼリアルタイムで自動で直すこと自体はマネしづらいですが、
何かしらのトリガーによって、ClaudeCodeを起動 → カスタムコマンドの送信 → 以降おまかせ というのを自動化できるのは、汎用性のあるフローだと思うので、まねしてみてください

もし、上記を使ったいいアイデアあれば教えてください まねします
最後まで読んでいただき、ありがとうございました!!!

Discussion