Tasuke HubLearn · Solve · Grow
#Edge Functions

Edge Functionsエラーハンドリング実践【2025年版】:フォールトインジェクションで堅牢化する

Next.js Edge Runtime/Edge Functionsでのエラーハンドリングを体系化。タイムアウト/再試行/フォールバック/サーキットブレーカー/フォールトインジェクションの設計とコード例を解説。運用メトリクスとSLO連携も含む。

時計のアイコン13 September, 2025
TH

Tasuke Hub管理人

東証プライム市場上場企業エンジニア

情報系修士卒業後、大手IT企業にてフルスタックエンジニアとして活躍。 Webアプリケーション開発からクラウドインフラ構築まで幅広い技術に精通し、 複数のプロジェクトでリードエンジニアを担当。 技術ブログやオープンソースへの貢献を通じて、日本のIT技術コミュニティに積極的に関わっている。

🎓情報系修士🏢東証プライム上場企業💻フルスタックエンジニア📝技術ブログ執筆者

失敗前提の設計

エッジ層は高速だが、ネットワークや上流依存の失敗に晒されます。最初に「失敗の型」を定義し、ハンドリング戦略を決めます:タイムアウト、レート超過、オリジン不達、整合性エラー、データ欠損。


ベストマッチ

最短で課題解決する一冊

この記事の内容と高い親和性が確認できたベストマッチです。早めにチェックしておきましょう。

タイムアウトと再試行(ジッタ付き)

// app/api/edge-resilient/route.ts
export const runtime = 'edge';

async function fetchWithTimeout(url: string, ms = 1500, init?: RequestInit) {
  const ctrl = new AbortController();
  const t = setTimeout(() => ctrl.abort('timeout'), ms);
  try {
    const res = await fetch(url, { ...init, signal: ctrl.signal });
    return res;
  } finally { clearTimeout(t); }
}

async function retry<T>(fn: () => Promise<T>, times = 2) {
  let e: any;
  for (let i = 0; i <= times; i++) {
    try { return await fn(); } catch (err) {
      e = err; await new Promise(r => setTimeout(r, 100 + Math.random()*200));
    }
  }
  throw e;
}

export async function GET() {
  try {
    const r = await retry(() => fetchWithTimeout('https://example.com/api', 1200));
    if (!r.ok) throw new Error(`upstream ${r.status}`);
    return new Response(await r.text(), { headers: { 'content-type': 'application/json' } });
  } catch (e: any) {
    // フェイルソフト:キャッシュ or 既定値
    return new Response(JSON.stringify({ ok: false, cached: true, items: [] }), { status: 200 });
  }
}

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

サーキットブレーカー(簡易)

let failures = 0, openedAt = 0;
function allowCall() { return failures < 5 || Date.now() - openedAt > 5000; }
function record(ok: boolean) { ok ? failures = 0 : (failures++, openedAt = Date.now()); }

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

フォールトインジェクション(動作確認)

// ?fi=timeout|500|drop で擬似障害
export async function GET(req: Request) {
  const fi = new URL(req.url).searchParams.get('fi');
  if (fi === 'timeout') await new Promise(() => {});
  if (fi === 'drop') return new Response(null, { status: 204 });
  if (fi === '500') return new Response('boom', { status: 500 });
  // 通常処理...
  return Response.json({ ok: true });
}

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

メトリクスとSLO

成功率/レイテンシ/タイムアウト率/フォールバック率を収集し、SLO逸脱でNode Runtimeへ切替。実験用クエリ(fi)は本番では認証やIP制限で保護します。


さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

まとめ

「再試行+タイムアウト+フェイルソフト+観測」を最小キットとして導入し、フォールトインジェクションで確実に効くことを検証しましょう。

さらに理解を深める参考書

関連記事と相性の良い実践ガイドです。手元に置いて反復しながら進めてみてください。

この記事をシェア

続けて読みたい記事

編集部がピックアップした関連記事で学びを広げましょう。

#Edge Functions

Edge Functionsログ・トレース運用ガイド【2025年版】:観測性を組み込む実践チェックリスト

2025/9/13
#Next.js

Next.js Edge Runtime実践ガイド【2025年版】:低レイテンシとストリーミングを最大化する

2025/9/13
#Image Optimization

画像ワークフロー実践【2025年版】:アップロード署名・Moderation・CDN署名URLまで

2025/9/13
#MLOps

MLOpsパイプライン構築実践ガイド:MLflowとGitHub Actionsで作る機械学習CI/CD【2025年版】

2025/9/19
#CI/CD

CI/CD パイプライン遅延問題完全解決ガイド【2025年GitHub Actions最適化決定版】

2025/8/17
#Python

【2025年完全版】Python asyncioエラー完全解決ガイド:15のエラーパターンと実践的解決策

2025/11/28