Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
キーワードは「延命」 ― リプレイス困難システムの現実的バージョンアップ戦略 / The ke...
Search
CARTA Engineering
March 21, 2026
0
23
キーワードは「延命」 ― リプレイス困難システムの現実的バージョンアップ戦略 / The keyword is extending lifespan a realistic upgrade strategy for systems that are difficult to replace
CARTA ZERO @yish0
CARTA Engineering
March 21, 2026
Tweet
Share
More Decks by CARTA Engineering
See All by CARTA Engineering
CARTAのAI CoE が挑む「事業を進化させる AI エンジニアリング」 / carta ai coe evolution business ai engineering
carta_engineering
1
3.7k
実例と表現で学ぶWeb Components 〜"愛される"広告表現とShadowDOM〜 / practical-guide-to-lovable-ads-shadow-dom
carta_engineering
0
73
Snowflakeとdbtで加速する 「TVCMデータで価値を生む組織」への進化論 / Evolving TVCM Data Value in TELECY with Snowflake and dbt
carta_engineering
2
730
エンジニアインターン「Treasure」とHonoの2年、そして未来へ / Our Journey with Hono Two Years at Treasure and Beyond
carta_engineering
0
710
AIに淘汰されない技術力とは?事業を進化させるエンジニアの実践知 / engineering-skills-that-ai-cant-replace-and-drive-business-evolution
carta_engineering
0
200
AIは脅威でなくチャンス。 AIと共に進化するエンジニアの成長戦略 / spz-colab-conf-2025
carta_engineering
0
300
鳴り止まないアラート対応の中で学んだ 監視改善の進め方 / team-based-monitoring-improvement-from-alert
carta_engineering
0
730
撤退危機からのピボット : 4年目エンジニアがリードする TypeScript で挑む事業復活 / crisis-to-pivot-4th-year-engineer-ts-relaunch
carta_engineering
2
1.8k
4社統合におけるマスタデータ管理に立ち向かう / Towards master data management in the four-company integration
carta_engineering
0
1.4k
Featured
See All Featured
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
180
A Tale of Four Properties
chriscoyier
163
24k
Leo the Paperboy
mayatellez
4
1.5k
Building Applications with DynamoDB
mza
96
7k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
400
Paper Plane
katiecoart
PRO
0
48k
Why Our Code Smells
bkeepers
PRO
340
58k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.8k
The Curse of the Amulet
leimatthew05
1
10k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
280
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.8k
Transcript
PHPerKaigi 2026 キーワードは「延命」 リプレイス困難システムの現実的バージョンアップ戦略 @yish0
株式会社CARTA HOLDINGS 李丞浩(スンスン) @atto_whicker 紹介 • 出身は韓国 • 2017年から日本で生活中 •
2023年 株式会社CARTA HOLDINGS入社 • シニアエンジニア一人とバージョンアップ中 • 初登壇なのでワクワクしてます
AGENDA 01 アフィリエイトシステムについて 02 とりあえずバージョンをあげた 03 ミラーリングでロジックを検証する 04 一つのブランチで完結させる 05
うまくいかなかったこと
01 アフィリエイトシステムについて
PHPerKaigi2026 アフィリエイト広告サービス メディア 広告 サービス 広告主 クリック 計測 成果計測 成果発生
LPページ クリック 遷移 成果通知 成果支払 24時間無停止運用 広告クリック→成果(ex. install)→レポーティング→メディアに支払い
PHPerKaigi2026 アフィリエイト広告サービス メディア 広告 サービス 広告主 クリック 計測 成果計測 成果発生
LPページ クリック 遷移 成果通知 成果支払 24時間無停止運用 広告クリック→成果(ex. install)→レポーティング→メディアに支払い 成果を測った結果をもとに お金が計算される
PHPerKaigi2026 アフィリエイト広告サービス メディア 広告 サービス 広告主 クリック 計測 成果計測 成果発生
LPページ クリック 遷移 成果通知 成果支払 24時間無停止運用 バージョンアップ対象 ここ
PHPerKaigi2026 アフィリエイト広告サービス メディア 広告 サービス 広告主 クリック 計測 成果計測 成果発生
LPページ クリック 遷移 成果通知 成果支払 24時間無停止運用 • 配信された広告の成果データを収集するサーバー • PHP5.6 / Amazon Linux 2で動いてる
PHPerKaigi2026 システムの現状 • 新システムへのリプレイス予定 • 新規開発なし • メンテナンスのみ • お金はちゃんと稼いでる
延命させる
• 多量のレガシースクリプトphp • ドメイン知識なし、仕様書もなし • エンドポイント230本 • サービス利用者は多い。 この状況、あなたならどうしますか?
02 とりあえずバージョンをあげた
PHPerKaigi2026 まずはPHP8.4にしてみた • スクリプトのindex.phpが多くてテストだけじゃ足りない • そもそもテストのカバレッジは20%以下 • OSが古くて(Amazon Linux 2)PHP
8.4がセットアップできない 現れた課題↓ • テストは失敗 → テスト修正 → テスト通過 • サーバー起動 → 起動失敗
PHPerKaigi2026 テストどうするか • スクリプトのindex.phpは10,000行くらい • そもそもテストのカバレッジは20%以下 今からカバレッジあげてスクリプトもなんとかする? 大変すぎる
PHPerKaigi2026 とりあえず叩いてみる • 今からロジックを全てテストする仕組みは無理 • テストでロジックを担保するのは諦めてエラー吐くかだけ調べる どうやって全てのエンドポイントの実行に必要なパラメータを揃える? アクセスログ
PHPerKaigi2026 とりあえず叩いてみる • アクセスログ調査結果、有効エンドポイントは50個くらい • アクセスログのリプレイによるsmokeテスト追加 • 本番DBをCloneしてシードデータも揃えた smokeテストからのエラーを地道に修正し、リプレイテストの通過率100%を達成
PHPerKaigi2026 サーバーを起動させる • 既存はremi-repository利用 • remi-repositoryだとAmazonLinux2ではphp8.3まで • しかもそのrepositoryはEOLになってる OSもAmazonLinux2023に上げる
テストは通った、サーバーも起動された。 でも不安しかない
今まで確認したこと • テストは通る • エンドポイント叩いてもエラー吐かない • サーバーは起動できる 結局、挙動に問題あるかは確認できてない。 E2Eテストでも作る?
楽したい、、
03 ミラーリングでロジックを検証する
PHPerKaigi2026 ミラーリング • テスト書くの大変 • コード読んで仕様確認するのも大変 • 楽したい! • 結局、同じinputが同じoutputを出力するのが分かればいい
• 本番で実際のユースケースで確認できる • 本番と同じ環境で動きが確認できる ミラーリング
PHPerKaigi2026 使ったツール https://github.com/probelabs/goreplay
PHPerKaigi2026 使ったツール https://github.com/probelabs/goreplay Proxy❌ Response比較⭕
構成 • GoReplayは本番サーバー内で動く • Responseの比較はミドルウェアで処理
PHPerKaigi2026 差分の確認 • GETはそのままresponse比較する • POSTは何が書かれるか確認する仕組みが必要 ◦ responseやログを活用 再現が難しい差分 テスト追加で倒す
移行 • listener rule設定で検証済みエンドポイントのみ別のTGに向ける • 問題発覚時にすぐ取り戻せる
感想 • テストが整ってない状況で使い勝手がいい ◦ 実際のユースケースで動きか検証できる • 実装も難しくなかった ◦ AIを利用すればミドルウェアも簡単に出来上がるので工数もそんなにかからない •
本番と同じ環境で検証できるのは安心できた ◦ 後から移行した時、環境による動きの違いなどが心配にならない ◦ 同じ環境、同じコードで動いてるので移行時にあまり不安にならない
04 一つのブランチで完結させる
実はこれ、全部一つのブランチでやりました
ワンコード戦略 一つのブランチでphp5.6とphp8.4どっちでも動く
PHPerKaigi2026 composerのautoload namespace => pathのマッピング spl_autoload_register()で composerのloader登録
PHPerKaigi2026 composerのautoload composerのloaderより優先してloadすれば、ファイルの分岐が出来そう
PHPerKaigi2026 autoloadを活用したワンコード composerのloaderより優先する loaderを作成
05 うまくいかなかったこと
PHPerKaigi2026 ある日の朝 ビジネスサイドからの連絡、 昨夜からレポートの成果記録が全部0件になってるんですが、、、 →一日多量の成果が発生するサービスなのに成果記録が止まっていた。
PHPerKaigi2026 成果記録が止まっていた原因 ログディレクトリのRead権限をfluentdに付与するだけだったのに、、 権限付与でミスってしまった クリック 成果通知 成果記録 ここが壊れた
PHPerKaigi2026 アラートはあった。が 壊れる前は壊れてることに気づけなかった • 作られたのは2021年 • 動くはずのないアラートだった
PHPerKaigi2026 結果 • ピークタイムの前日5時間分の成果は蒸発 • ビジネス側のクライアント対応 • バージョンアップ一時停止 成果記録だけは止まってはいけない 苦しい、、どこで壊れるか怖い、、
⇩
PHPerKaigi2026 安全フェンスを作る • このサービスの根幹、成果記録だけは絶対守る 成果記録の一連の流れを本番に叩いて確認 成果記録の一連の流れを常に確認できる仕組みを導入 クリック 成果通知 成果記録
終わりに • まずは踏み出してみる ◦ とりあえず手を動いてみることで次の課題が見える ◦ 課題が見えたらそれを一つ一つ倒してたら前に進んでる • 安全フェンスを作っておく ◦
絶対止まってはいけない仕組みを守る ◦ 最悪の状況にはならない・気づける
ご静聴ありがとうございました