koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

VPS1台で動いていたLAMPなLaravel5をServerlessなLaravel12にした

VPS1台で動いていた10年物のWebアプリケーションを、AWSのサーバレス環境にした例のメモ。

そのうち移行が必要なことは何年も前から分かっていたのだけれど大分億劫だったのが、昨今の生成AIを使えばそんなに手間をかけなくても移行できるのではないか? と思って試して、実際さほど手間をかけなくても移行できた気がしている。

PHPのコードが数千行程度の小規模なものなので手でやっても手間は大差なかった可能性もあるが、生成AIがきっかけにはなったので助かった。

ワンチャンCopilot Coding Agentがやってくれないか?

@copilot+Claude-Opus-4.6
本リポジトリのアプリケーションを最新のLaravel(2026年3月現在ではv12)にマイグレーションする計画を立ててください。 
あなた(GitHub Copilot Agent)が自律的にマイグレーションを進行できる計画にしてください。 
Laravelのバックエンド処理に加えて、フロントエンドパッケージ、フレームワークの更新も計画に含めてください。 
データベースエンジンはMySQL8系を想定してください。 
最終的にマイグレーションしたアプリケーションのコンテナを何らかのコンテナランナーにデプロイすればよいようになることが目標です。 
また、ローカルマシンではdocker compose upで起動できるようになることを必須とします。

参考 Laravelのアップグレードガイド(過去のバージョンからのアップグレードを段階的に行う必要がある点に留意すること) 
https://laravel.com/docs/12.x/upgrade
https://laravel.com/docs/11.x/upgrade
https://laravel.com/docs/10.x/upgrade
https://laravel.com/docs/9.x/upgrade
https://laravel.com/docs/8.x/upgrade
https://laravel.com/docs/7.x/upgrade
https://laravel.com/docs/6.x/upgrade

結果、計画ではなくいきなり移行をはじめ、アップグレードガイドはほぼ無視されたが7割方動く状態にはなっていた。 その後、Coding Agentへの指示を中心に、細かいところは人間が介入してAWSのサーバレス環境で動作するようになった*1

LAMPのMの部分は、AWSのマネージドサービスは最低価格がバカ高いので、MySQL互換で従量課金(小さいボリュームならほぼゼロ)なTiDB CloudのStarterプランとしてみた。特に互換性の問題はなく動いている。

生成AIでの移行感

主な移行作業には以下のようなものがあった。

  • Laravelのアップグレード
  • ファイルアップロード先の変更
  • Serverless Frameworkの構成
  • フロントエンド

概ねブラウザ上でCopilot Coding Agentに対して指示して、結果が出てくるのを待っていた。 一部ローカルマシンのVSCode+Copilotで処理した。

Laravelのアップグレード

先述の通り、そこそこ動くものが1回の指示で出てきた。 が、それなりに破壊的な変更もされたので、一定リグレッションの修正は発生した。

テストのようなものはほぼ書いていなかったので、この移行を機に実装を正としてユニットテストを書いてもらった。

ファイルアップロード先の変更

ローカルファイルシステム(1台のVPSなのでこれができた)からS3+署名付きURLに変更した。

手作業でやるにはこれが面倒だなぁ、と思っていたのだけれど、指示一つで動く形で移行されてしまった。

ユーザーがアップロードするファイルのアップロード先をS3に変更してください。 aws環境での権限は実行ロールに付与してください。 画面からの参照は署名付きurlとします。

既存のデータはファイルシステムにアップロードされています。 単純にS3にコピーしておけば後方互換性を担保できるようにしてください。

ローカルマシンでの開発やCIでは何らかのエミュレータを用いてください。 エミュレータ選定に当たっては最新のライセンス事情に留意さること。

マジでこれだけの指示で終わってしまった。 本当に何も修正していない。 手でやっていたら半日以上はかかったと思う。

Serverless Frameworkの構成

これは結構調整が大変だった。

生成AIが自律的に検証を行えない分野なので「設定のYAMLを書いてもらう、デプロイして疎通確認、調整」の流れを何度か繰り返した。

それでも、手でゼロから書くよりは早かったかと思う。

この半年の生成AIの仕事ぶりの成長に感動した - koudenpaのブログ でも書いたけれど

いかに生成AI自体が総合的な検証を行えるようにするのか? これが大事になってくるだろう。

という気持ちが強い。

フロントエンド

元々はBladeテンプレートでBootstrap3をフレームワークとしていた。 単にアップグレードを指示した際には案の定Tailwindが構成されていた*2のだけれど、実装は置き換わっていない壊れた状態になっていた。

デザインを大きく変えたくはなかったので、TailwindはやめてBootstrap5でBootstrap3風のテーマ設定をするように指示した。 完全な再現性を求めなかったため、生成結果に対して軽い調整で済んだ*3

まとめというか小並感

レガシーコードのアップグレードは生成AIの得意分野であると感じた。

エンタープライズの世界ではマイグレーション用に調整されたツールも出てきているし、今後より便利になることが期待できると思う。

*1:指示ではコンテナランナーとしているが、ケチケチ構成のために完全従量課金のサーバーレスにした形

*2:生成AIはTailwindが大好きな印象がある

*3:完全な再現をしようとすると、生成AI関係なしに地獄を見るかと思う