In-Situ Testing: Micro-Frontendsを本番環境にトンネリング

ローカルコンポーネントが本番環境でどのように見えるかを推測するのはやめましょう。ここでは、選択的インジェクション技術を使って、特定の本番スロットをローカルの開発サーバーとホットスワップする方法を解説します — 実際の環境を反映したテストのために。
ステージング環境は戦いに負けている
従来のステージング環境はモノリシック時代には理にかなっていました。1つのコードベース、1つのデプロイ、1つのミラー環境です。しかし、そのモデルは急速に崩れつつあります。
2026年までに、多くの大規模フロントエンドアプリケーションはもはやモノリシックではありません。独立してデプロイされるマイクロフロントエンド(MFEs)の構成になっており、それぞれが別のチームによって所有され、異なるフレームワークで構築され、異なるCDNオリジンから提供されています。これらすべてを忠実にミラーリングするステージング環境 — 本番のCDNヘッダー、WAFルール、エッジ関数の挙動、実ユーザーデータを含む — を維持するのは、もはや不可能に近い作業です。
この業界の対応として、徐々にin-situ testing(インシチュテスト)へのシフトが進んでいます。これは、ライブの本番UI内で特定のコンポーネントのローカル開発ビルドを直接検証する方法であり、全体の本番環境をローカルで再現しようとするのではなく、部分的に検証します。
この記事では、その仕組み、実際の技術、そして現状のツールについて解説します。
マイクロフロントエンドの「アイランド」トンネリングとは?
この技術を理解するには、その動作するアーキテクチャを理解することが役立ちます。
Islandsアーキテクチャ vs. マイクロフロントエンド
Islandsアーキテクチャは、静的HTMLで構成されたウェブページに、独立してHydrateされるインタラクティブなJavaScriptの「島」が散在している構造を指します。各島は、ページの他の部分に影響を与えずにロード、実行、再レンダリングされます。Astroのようなフレームワークは、部分的なHydrationを可能にし、必要なコンポーネントだけにJavaScriptを送るモデルを普及させました。
一方、マイクロフロントエンドは組織レベルで同様の哲学を採用しています。フロントエンドアプリケーションは、独立してデプロイ可能なユニットに分解され、それぞれが別のチームによってエンドツーエンドで管理されます。UIを自己完結型の断片の集合として扱う点で共通しています。
実際には、多くの2025-2026年のチームは両者を組み合わせており、MFEアーキテクチャ内で各マイクロフロントエンドが内部的にIslandsの原則に従って構築されているケースもあります。
2つの層
この種のアーキテクチャで作業するには、2つの異なる層について考える必要があります。
シェル — ルーティング、グローバル認証状態、デザイントークン、レイアウトフレームを管理する永続的なコンテナ。通常CDNのエッジにあり、すべてのユーザに共通です。
アイランド — シェル内の特定のスロットにマウントされる独立した機能ユニット。例えば、チェックアウトフロー、ユーザープロフィールカード、通知ドロワーなど、シェルとのインターフェースが定義されたUIの一部です。
アイランドトンネリングは、シェルを本番サーバに置いたまま、特定のアイランドだけをローカルの開発ビルドに置き換える手法です。通常のページ読み込みはそのままに、ターゲットのスロットだけをあなたのマシンにリダイレクトします。
選択的インジェクションの仕組み
アイランドトンネリングの背後にある仕組みは、単一のツールではなく、複数のWebプラットフォームのプリミティブが連携して動作しています。
1. ダイナミックインポートマップ
アイランドトンネリングの基盤は、ダイナミックなImport Mapです。アプリケーションバンドルにアセットURLをハードコーディングする代わりに、シェルはJSONのマニフェストを取得し、各MFEのエントリポイントの場所を定義します。
{
"imports": {
"checkout-mfe": "https://cdn.acme.com/checkout/v3/main.js",
"nav-mfe": "https://cdn.acme.com/nav/v2/main.js"
}
}
このマニフェストが動的(ランタイムにエンドポイントからフェッチされる)場合、セッションレベルで特定のエントリを上書きでき、再デプロイなしで変更可能です。
2. Module Federation 2.0
Module Federationは、もともとWebpack 5で導入され、マイクロフロントエンド間のコード共有の主要メカニズムです。2024年4月に発表され、2026年1月に安定版となる2.0リリースでは、ローカル上書きワークフローに直接関係する機能が追加されました。
特に、2.0のDevtoolはオンラインページからローカル開発環境へのモジュールのプロキシをサポートし、ホットアップデート機能を維持します。これがアイランドトンネリングの動作原理です。つまり、本番シェルが特定のリモートエントリをlocalhostに解決し、単一の開発セッションに限定して動作します。
また、2.0はランタイムとビルドツールを分離し、WebpackやRspackのプロジェクト間で同じランタイムを使えるようにしています。これにより、異種のMFEエコシステム間でのポータビリティが向上します。
3. ヘッダーによるセッション上書き
最もシンプルな選択的インジェクションは、HTTPヘッダーを使ってエッジミドルウェアに上書きを通知する方法です。例えば、ブラウザ拡張機能(または手動のヘッダー設定)を通じて次のようなヘッダーを付与します:
X-MFE-Override: checkout-mfe=https://dev-tunnel-7x92.example.dev
リクエストがCloudflare WorkerやVercel Edge Functionに到達すると、ミドルウェアはこのヘッダーを検査し、そのセッションだけに適用されるImport Map JSONを修正します。その他のユーザのセッションは変更されません。
// Edge Middleware例(Cloudflare Workers / Vercel Edge)
export default function middleware(request) {
const override = request.headers.get('X-MFE-Override');
if (override) {
return injectLocalMFE(request, override);
}
}
この上書きヘッダーは通常、署名付きトークンとともに短期間だけ有効で、他のユーザに悪用されるのを防ぎます。
4. Service Workerによるインターセプション(フォールバック)
エッジレベルの変更が不可能な本番環境(厳格なCSP、レガシーインフラ、CDN層を制御できない場合)では、Service Workerが同じ役割を果たします。
Service Workerは、ターゲットのMFEのremoteEntry.jsやindex.mjsへのリクエストをインターセプトし、ブラウザからのリクエストが出る前にトンネルURLにリダイレクトします:
self.addEventListener('fetch', event => {
if (event.request.url.includes('checkout/remoteEntry.js')) {
event.respondWith(
fetch('https://dev-tunnel-7x92.example.dev/remoteEntry.js')
);
}
});
この方法はサーバ側の協力なしに動作しますが、Service Workerの登録、アップデートサイクル、キャッシュの無効化などの追加の複雑さが伴います。
5. トンネルそのもの
ローカル開発サーバが本番シェルからアクセス可能である必要があります。つまり、公開されたHTTPS URLが必要です。これには従来のトンネリングツールが役立ちますが、用途を限定します。
Cloudflare Tunnel(cloudflared)やngrokはこの目的に適しています。Cloudflare Tunnelは、マシンからCloudflareのエッジネットワークへのアウトバウンド接続を確立し、安定したHTTPS URLでローカルポートを公開します。ngrokも同様で、設定が簡単で開発者向けUIも充実しています(localhost:4040でリクエストの検査とリプレイが可能)。2026年のワークフローでは、Cloudflare Tunnelは既存のCloudflareエコシステムに適しており、ngrokは迅速で一時的な開発セッションに向いています。
ポイントは、アイランドトンネリングでは、トンネルは1つのMFEのアセットだけを公開し、アプリ全体を公開しないことです。これにより、攻撃対象面積が限定されます。
6. Shadow DOMによる隔離
ローカルのアイランドが本番シェル内で動作する場合、ページのグローバルCSSカスケードを継承します。隔離がなければ、ローカルコンポーネントのスタイルが本番スタイルと衝突したり、逆に本番スタイルがローカルコンポーネントの外観を壊す可能性があります。
Shadow DOMは、ホスト要素に隠されたスコープ付きのDOMツリーをアタッチすることで解決します。シャドウルート内のスタイルは外に漏れず、外部のスタイルも侵入しません。これは、Module Federationの例リポジトリに含まれるCSS隔離の例でも採用されています。リモートMFEは、ロード時にShadow DOMコンテナにラップされ、その内部にCSSを注入します。
理解すべき注意点:
- Shadow DOMは、
colorやfont-sizeなどの継承CSSプロパティを境界を越えて伝播させません rem単位はルートの<html>要素に相対的です- グローバルスタイルは自動的に適用されません — 必要に応じてCSSカスタムプロパティを手動で渡す必要があります
- React 17未満のバージョンは、Shadow DOM内での動作が不安定です
ほとんどのアイランドトンネリングのユースケースでは、オープンシャドウルート(クローズドではなく)を推奨します。クローズドは、動的import()やコードスプリッティングの動作に干渉するためです。
7. トンネルを跨ぐホットモジュールリプレースメント
この仕組みの中で特に印象的なのは、HMR(Hot Module Replacement)が引き続き動作することです。ローカルでファイルを保存すると、WebpackやViteのHMR信号がトンネルを通じて本番シェルのページに伝わり、ターゲットのアイランドだけが再レンダリングされます。これは、HMRがWebSocket経由で動作しており、トンネルがそのWebSocketを維持している限り、更新信号はどこからでもブラウザに届くためです。
なぜステージングではなくインシチュでテストするのか?
インシチュテストが解決する具体的な問題は3つあります。
データの忠実性
ステージングのデータベースは、しばしば本番データと同期していません。null値や長すぎる文字列、非推奨のフィールドフォーマットなどのエッジケースは、本番データの方がはるかに頻繁に出現します。ローカルのアイランドを実際のAPIに対して動かすことで、これらのケースが開発中に明らかになります。
ネットワークとヘッダーの複雑さ
本番環境は、Webアプリケーションファイアウォール(WAF)、CDN層、ロードバランサの背後にあり、リクエストを変更します。ローカル環境で動作するコンポーネントが、本番ではX-Content-Type-Optionsヘッダーの欠如やWAFによるカスタムヘッダーの除去で静かに失敗することがあります。アイランドトンネリングは、これらの問題を開発段階で明らかにします。
ビジュアルコンテキスト
マイクロフロントエンドは、単独のページではなく、ビジュアル階層内のコンポーネントです。例えば、商品カルーセルの横にあるチェックアウトボタンや、z-indexを持つナビゲーションバー内のユーザアバター、シェルのグリッドシステムに依存するサイドバーウィジェットなどです。Storybookやローカル開発サーバでコンポーネントを単体でテストしても、実際のページにマウントしたときの挙動はわかりません。実際のURLで動作させることで、即座にビジュアルの真実が得られます。
2026年の実際のテストの状況
アイランドトンネリングは、過去数年で進んだフロントエンドのテストの変化の一部として位置付けられます。
従来のテストピラミッド — 単体テストを底に、E2Eを頂点に — は、現代のコンポーネント駆動アプリケーションには合わなくなっています。業界は、Kent C. Doddsが述べたTesting Trophyモデルに移行しています:
- 静的解析 — TypeScriptやESLintがエラーを事前に検出
- 単体テスト — 純粋関数やビジネスロジックのテストに限定
- 統合テスト — コンポーネントの連携を現実的な条件下で検証
- E2Eテスト — 重要なユーザージャーニーだけをカバーする小規模なテスト群
アイランドトンネリングは、このモデルを補完するものであり、置き換えるものではありません。PlaywrightのE2Eテストや統合テストを排除しません。むしろ、これらのテストが動作する環境と、実際のユーザが使う環境とのギャップを埋める役割を果たします。
実装の概要
最もシンプルなアーキテクチャパターンは次の通りです:
ステップ1 — Import Mapを動的にする。 シェルはビルド時ではなく、ランタイムにJSONマニフェストをフェッチします。これがセッションレベルの上書きの接点です。
ステップ2 — 監視するエッジミドルウェアをデプロイする。 Cloudflare WorkerやVercel Edge FunctionがImport Mapのリクエストをインターセプトし、ヘッダーやクッキーに基づいて該当エントリを修正します。
ステップ3 — ローカル開発サーバを起動し、トンネル経由で公開する。 例として、ポート3000でMFEをローカルで動かし、cloudflared tunnel --url http://localhost:3000やngrok http 3000を使います。公開されたHTTPS URLをメモします。
ステップ4 — 上書きを通知する。 ブラウザ拡張や手動設定のクッキー/ヘッダーを使って、エッジミドルウェアにトンネルURLを使った上書きを指示します。
ステップ5 — 本番にアクセスする。 シェルは通常通りロードされ、あなたのローカルアイランドがスロットにマウントされ、HMRも動作します。Shadow DOMの隔離によりスタイルの漏れも防止されます。
セキュリティ上の考慮点
本番環境でのローカルコードの注入はリスクを伴います。以下の点に注意が必要です:
セッションの権限。 ローカルのアイランドは、ログイン中のユーザのセッションCookieとともに動作します。テスト中に行われるAPI呼び出しは、実際の本番データに作用します。あたかも完全なユーザ権限を持つかのように扱います。
秘密情報の露出。 ローカルサーバの環境変数やAPIキーは、本番環境には不要です。これらはクライアントバンドルに含めないようにしましょう。
クロスオリジンの隔離。 Cross-Origin-Opener-Policy(COOP)やCross-Origin-Embedder-Policy(COEP)ヘッダーを設定し、インジェクトされたアイランドが親シェルのメモリ空間にアクセスできないようにします。これにより、SharedArrayBufferや高精度タイマーも利用可能になります。
スコープの厳格化。 上書きヘッダーやクッキーは、暗号署名され、短期間だけ有効にし、特定の開発者に限定します。広範囲に適用されると、任意のコードを本番セッションに注入できるセキュリティリスクとなります。
Content Security Policy(CSP)。 本番シェルのCSPは、トンネルURLへの接続を許可する必要があります。これは、nonceやハッシュを使った例外設定で対応します。
現在のツール状況
「アイランドトンネリング」という概念は有用なモデルですが、現時点で単一の主要ツールにはなっていません。実際には、既存のツールを組み合わせて実現しています:
- Module Federation 2.0 Devtool — 本番リモートをローカルにプロキシし、MFベースのアーキテクチャにおけるアイランドトンネリングに最も近い
- Cloudflare Tunnel / ngrok — ローカル開発サーバを公開
- カスタムエッジミドルウェア — Cloudflare WorkersやVercel Edge FunctionsがインターセプトとImport Mapの修正を行う
- Service Workers — エッジ制御ができない環境のフォールバック
- Playwright + Shadow DOMサポート — 自動化テストでローカルのアイランドを本番コンテキスト内で検証
ツールのギャップは依然として存在し、これらを一つのCLIで一括して動かすソリューションはまだありません。多くのチームはこれを自前で組み合わせており、プラットフォームチームの取り組みとして進めています。
まとめ
In-situ testingによるアイランドトンネリングは、現代のマイクロフロントエンドアーキテクチャの複雑さに対応した自然なアプローチです。完全な本番ミラーのステージング環境はコストが高く、CDNヘッダーやWAFの挙動、実データ、ビジュアルコンテキストを十分に再現できません。
動的Import Map、Module Federation 2.0のプロキシ機能、エッジミドルウェア、Service Workers、Cloudflare Tunnelやngrokといった標準的なトンネリングツールは、すでに実用段階にあります。CSSの隔離にはShadow DOMを利用し、オープンルートの方がクローズドよりも推奨されます。HMRもトンネル越しに動作します。
セキュリティ面の配慮も重要です。実ユーザの権限を持つセッション、秘密情報の管理、スコープの限定、CSPの設定など、慎重に扱う必要があります。
2026年の大規模なマイクロフロントエンドシステムを構築するチームにとって、最も実用的な方向性は、独立したアイランドに分解し、動的Import Mapを採用し、テスト用のインフラを整備して、全体を再デプロイせずに個別のアイランドを本番環境で検証できるようにすることです。
参考資料: Module Federation 2.0 announcement · Cloudflare Tunnel docs · CSS isolation in micro-frontends (LogRocket)
Related InstaTunnel pages
Continue from this article into the most relevant product guides and workflows.
Related Topics
Keep building with InstaTunnel
Read the docs for implementation details or compare plans before you ship.