Claude Code で Laravel→Django 全自動移行をやってみた(1/3)計画編

業務管理システム(PHP/Laravel 6.20)を Python/Django 4.2 に移行するプロジェクトを、Claude Code の自律実行でほぼ全自動で完遂しました。 移行元: Laravel 6.20 / PHP 8.0 / MySQL 5.7 / Blade テンプレート 移行先: Django 4.2 LTS / Python 3.11+ / MySQL 8.0 / Django Templates 所要時間: 約 5.5 時間(準備フェーズ除く) 成果物: 17 モデル / 50+ テンプレート / 199 テスト / 15,000 行の Python コード 本記事は 3 部構成です。 計画編(本記事)— なぜやったか、どう計画したか 自動化基盤編 — Claude Code を自律実行させるフレームワークの設計 実行結果・教訓編 — 実際に何が起きたか、次回への教訓 プロジェクトの背景 移行対象は、ある業種特化の業務管理システムです。契約管理・マスタ管理・CSV インポート・Excel エクスポート・月次締処理・外部サービス連携(OAuth2 / REST / GraphQL)など、典型的な業務アプリの機能を一通り備えています。 ...

2026年3月26日 · 3 分

Claude Code で Laravel→Django 全自動移行をやってみた(2/3)自動化基盤編

前回の計画編では、移行の方針とフェーズ設計を紹介しました。本記事では、計画を実際に自律実行するためのフレームワーク設計を解説します。 全体アーキテクチャ 自律移行の仕組みは、大きく 3 つのレイヤーで構成されています。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ┌─────────────────────────────────────────────────────┐ │ オーケストレーション層: run-issue.sh │ │ - Issue 読み込み → ブランチ作成 → Claude 起動 │ │ - リトライ → Push → PR 作成 → マージ → Issue 閉じ │ └──────────────────┬──────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────┐ │ 実行層: Claude Code (claude -p) │ │ - ソースコード調査 → 設計 → 実装 → テスト │ │ - コミット(push はしない) │ │ - サブエージェント: explorer / architect / reviewer│ └──────────────────┬──────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────┐ │ 品質保証層: Hooks + CI + verify-phase.sh │ │ - Pre-commit: ruff format + check │ │ - PostToolUse: 編集時の即座リント │ │ - CI: lint → Django check → pytest │ │ - Phase 検証: ファイル存在 + 機能チェック │ └─────────────────────────────────────────────────────┘ 責務分離の原則 最も重要な設計原則は、ワークフロー制御と実装作業の責務分離です。 ...

2026年3月26日 · 5 分

Claude Code で Laravel→Django 全自動移行をやってみた(3/3)実行結果・教訓編

計画編で方針を、自動化基盤編でフレームワークを紹介しました。最終回では、実際に 15 Issue を自律実行した結果と、得られた教訓を共有します。 実行結果サマリー タイムライン 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 12:06 ── Phase 0: 初期セットアップ ────── 12分 (リトライ1回) 12:18 ── Phase 1-1: マスタモデル ──────── 14分 (リトライ1回) 12:33 ── Phase 1-2: 契約モデル ──────── 12分 12:45 ── Phase 1-3: 入金・会計モデル ──── 9分 12:57 ── Phase 2: 認証 & API ────────── 12分 (リトライ1回) 13:09 ── Phase 3-1: テンプレート ──────── 16分 (リトライ2回) 13:25 ── Phase 3-2: マスタ CRUD ────── 21分 13:46 ── Phase 4-1: 契約検索 ──────── 12分 13:58 ── Phase 4-2: 契約 CRUD ──────── 16分 14:14 ── Phase 4-3: 支払・入金 ──────── 21分 (リトライ1回) 14:35 ── Phase 5-1: CSV インポート ──── 24分 (リトライ1回) 14:59 ── Phase 5-2: Excel エクスポート ── 24分 (リトライ1回) 15:00 ── Phase 6: 月次締処理 ──────── 10分 15:34 ── Phase 7: テスト ──────────── 20分 (リトライ2回) 15:54 ── Phase 8: デプロイ準備 ──────── 8分 合計: 約 5.5 時間 数値で見る結果 項目 数値 完了 Issue 15 / 15 総コミット 84 うち修正コミット (fix:) 16 (19%) リトライ発生 Issue 8 / 15 (53%) 最大リトライ回数 2 回 Python コード行数 約 15,000 行 テンプレート 50+ ファイル テスト数 199 テスト通過率 100% 1 Issue あたり平均時間 15〜25 分 うまくいったこと 1. inspectdb による正確なモデル定義 既存 DB ダンプから inspectdb でモデル雛形を生成し、それを整理する方式は非常に効果的でした。カラム名・型・制約が実 DB と完全一致するため、「モデル定義を書いたが DB と合わない」問題が発生しませんでした。 ...

2026年3月26日 · 4 分

CloudWatch Logs のエラーを自動で GitHub Issues に課題化する

CloudWatch Logs のエラーを自動で GitHub Issues に課題化する ECS で稼働するWebアプリケーションのエラーログを自動的に GitHub Issues に報告する仕組みを構築しました。手動でログを監視する必要がなくなり、エラー発生時に即座にチームが認識・対応できるようになります。 背景 マルチテナントの業務システムを ECS Fargate 上で運用しています。アプリケーションは2つあり、それぞれ異なるフレームワークで構築されています。 アプリ フレームワーク 用途 web Laravel (PHP) 業務管理システム api Django (Python) API サーバー これまで CloudWatch Logs にログは収集していたものの、エラーの検知は手動確認に頼っていました。500エラーや例外発生を見逃すリスクがあり、自動検知の仕組みが必要でした。 アーキテクチャ Subscription Filter + Lambda + GitHub Issues API の構成を採用しました。 CloudWatch Logs (/ecs/{prefix}-ecs-{app}) └── Subscription Filter (エラーパターンマッチ) └── Lambda Function (Docker/arm64, Python 3.12) ├── エラー解析 (HTTP 5xx, 例外, スタックトレース) ├── ±5秒のログコンテキスト取得 ├── 既存 Open Issue 検索 └── 新規 Issue 作成 or 既存 Issue にコメント追加 この構成を選んだ理由 方式 リアルタイム性 柔軟性 コスト Subscription Filter + Lambda (採用) 高 高 中 Metric Filter + Alarm + SNS 中 (1分以上遅延) 低 低 CloudWatch Logs Insights (定期実行) 低 高 低 Subscription Filter はログ出力時にほぼリアルタイムで Lambda を起動するため、エラー発生から数秒で Issue が作成されます。 ...

2026年2月24日 · 4 分

Laravel: マイグレーション

Laravel マイグレーション Laravel マイグレーションを1つずつ戻す 1 $ php artisan migrate:rollback --step=1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 MySQL [mysite]> select * from migrations; +----+--------------------------------------------------------------+-------+ | id | migration | batch | +----+--------------------------------------------------------------+-------+ | 1 | 2014_10_12_000000_create_users_table | 1 | | 2 | 2014_10_12_100000_create_password_resets_table | 1 | | 3 | 2019_08_19_000000_create_failed_jobs_table | 1 | | 4 | 2019_12_14_000001_create_personal_access_tokens_table | 1 | | 5 | 2021_01_27_074301_create_sessions_table | 1 | | 6 | 2021_02_03_055949_create_products_table | 1 | | 7 | 2021_02_03_060047_create_news_table | 1 | | 8 | 2021_02_08_024947_create_credit_cards_table | 1 | | 9 | 2021_02_08_025236_create_licenses_table | 1 | | 10 | 2021_02_08_060434_create_orders_table | 1 | | 11 | 2021_02_18_124506_create_options_table | 1 | | 12 | 2021_03_10_093455_update_string_fields_to_text | 2 | | 13 | 2021_04_09_123358_add_users_deleted_at_field | 3 | | 14 | 2021_04_09_123459_add_licenses_subscription_cancelled_fields | 3 | +----+--------------------------------------------------------------+-------+ 14 rows in set (0.002 sec) 1 % php artisan migrate:rollback --step=1 ************************************** * Application In Production! * ************************************** Do you really wish to run this command? (yes/no) [no]: > yes Rolling back: 2021_04_09_123459_add_licenses_subscription_cancelled_fields Rolled back: 2021_04_09_123459_add_licenses_subscription_cancelled_fields (165.69ms) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 MySQL [mysite]> select * from migrations; +----+-------------------------------------------------------+-------+ | id | migration | batch | +----+-------------------------------------------------------+-------+ | 1 | 2014_10_12_000000_create_users_table | 1 | | 2 | 2014_10_12_100000_create_password_resets_table | 1 | | 3 | 2019_08_19_000000_create_failed_jobs_table | 1 | | 4 | 2019_12_14_000001_create_personal_access_tokens_table | 1 | | 5 | 2021_01_27_074301_create_sessions_table | 1 | | 6 | 2021_02_03_055949_create_products_table | 1 | | 7 | 2021_02_03_060047_create_news_table | 1 | | 8 | 2021_02_08_024947_create_credit_cards_table | 1 | | 9 | 2021_02_08_025236_create_licenses_table | 1 | | 10 | 2021_02_08_060434_create_orders_table | 1 | | 11 | 2021_02_18_124506_create_options_table | 1 | | 12 | 2021_03_10_093455_update_string_fields_to_text | 2 | | 13 | 2021_04_09_123358_add_users_deleted_at_field | 3 | +----+-------------------------------------------------------+-------+ 13 rows in set (0.002 sec)

2021年5月17日 · 2 分

Laravel - Laravel PHP Framework

laravel.jp

2015年8月3日 · 1 分