言語を切り替える
テーマを切り替える

OpenAI API がタイムアウトする?Workers で専用チャネルを構築、コストゼロで安定化

引言

先週、ChatGPT アプリを開発していて、フロントから API を叩いたら接続タイムアウト——国内からは OpenAI に直接つながりません。ネットで買ったプロキシも試しましたが、信頼できるか不安で、API Key が漏れるリスクも大きい。VPS を借りて自前構築する案もありましたが、月額コストにサーバー設定・運用の手間がかかります。

そこで見つけたのが Cloudflare Workers。完全無料で、5 分もあれば構築できます。2 ヶ月以上使っていますが、安定しているうえ、有料プロキシより速いこともあります。本記事では、すぐ使えるコード付きで手順を共有します。

なぜ Cloudflare Workers を選ぶのか

10 万回/日
無料リクエスト枠
300+
グローバル CDN ノード
5 分
デプロイ完了時間
Source: Cloudflare公式データ

コストゼロ、個人開発者に十分

Workers の無料プランは、1 日 10 万リクエスト、毎分 1000 回まで使えます。「無料で大丈夫?」と最初は思いましたが、個人開発・学習・小規模プロジェクトなら十分でした。

ざっくり計算すると、1 リクエスト平均 2 秒として、1 日 8 時間ぶっ続けで呼び出しても 2000 回程度。10 万回の枠を使い切るには、何日もかかります。

サーバー不要で手間が少ない

従来は VPS を借り、Nginx でリバースプロキシを組み、落ちないか心配する必要がありました。Workers ならインフラは Cloudflare が面倒を見てくれるので、コードを数行書くだけです。

Workers は Cloudflare のグローバル CDN 上で動くため、単一 VPS より速くなることもあります。世界 300 都市超にノードがあります。

API Key をフロントに出さない

ここが特に重要です。フロントから直接 OpenAI API を叩くと、ブラウザの開発者ツールで API Key が丸見えになります。Workers を中間に置けば、フロントは Worker の URL だけを叩き、本物の API Key は Cloudflare の環境変数に安全に保管できます。

"2025 年 8 月、Cloudflare は OpenAI と提携し、OpenAI のオープンソースモデルを Workers AI に統合。毎日 10,000 Neurons の無料枠を提供"

- Cloudflare公式発表

2025 年の新しい特典

2025 年 8 月の OpenAI 提携で、純正 API のプロキシだけでなく、Cloudflare 提供のモデルも Workers AI から直接使えます。毎日 10,000 Neurons の無料枠付きです。

構築前の準備

準備はとてもシンプルです。

アカウントとリソース:

  • Cloudflare アカウント(無料登録、数分)
  • OpenAI または Claude の API Key(お持ちのはず)
  • ドメイン(任意。無料の .workers.dev サブドメインも付与されます)

技術要件:

  • JavaScript の基礎(fetch が読めれば OK)
  • HTTP の基礎

所要時間:

  • 初回:5〜10 分
  • 慣れれば:3 分

実践:5 分で OpenAI プロキシを構築

ステップ 1:Worker を作成

Cloudflare コンソールにログインし、左メニューから「Workers & Pages」を開きます。「Create Application」→「Create Worker」を選びます。

Cloudflare がランダム名(例:aged-shadow-1234)を付けますが、openai-proxy などに変更して「Deploy」でデプロイ。まだ何もしませんが、動く Worker ができています。

ステップ 2:コードを書く

「Edit Code」でエディタを開き、次のコードを貼り付けます。

export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    // ドメインを OpenAI の API アドレスに置換
    url.hostname = 'api.openai.com';
    // 新しいリクエストを作成
    const newRequest = new Request(url, {
      method: request.method,
      headers: request.headers,
      body: request.body
    });
    // リクエストを転送してレスポンスを返す
    const response = await fetch(newRequest);
    // CORS クロスオリジン問題を処理
    const newResponse = new Response(response.body, response);
    newResponse.headers.set('Access-Control-Allow-Origin', '*');
    newResponse.headers.set('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
    newResponse.headers.set('Access-Control-Allow-Headers', 'Content-Type, Authorization');
    return newResponse;
  }
};

コードの流れ:

  1. フロントからのリクエストを受け取る
  2. ドメインを api.openai.com に差し替える
  3. 修正したリクエストを OpenAI に転送
  4. レスポンスをそのまま返す
  5. CORS もここで処理

「Save and Deploy」で保存します。

ステップ 3:テスト

デプロイ後、Worker の URL(例:https://openai-proxy.あなたの名前.workers.dev)が表示されます。

curl で試します(YOUR_API_KEY を自分のキーに置き換え):

curl https://openai-proxy.あなたの名前.workers.dev/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d '{
    "model": "gpt-3.5-turbo",
    "messages": [{"role": "user", "content": "Hello!"}]
  }'

OpenAI から正常なレスポンスが返れば成功です。

応用:複数の AI サービスに対応

Claude API プロキシ

Claude は OpenAI と構造が少し違い、主にリクエストヘッダーが異なります。次のように分岐を足します。

export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    // パスでサービスを判定
    if (url.pathname.startsWith('/claude')) {
      // /claude プレフィックスを除き Anthropic へ
      url.pathname = url.pathname.replace('/claude', '');
      url.hostname = 'api.anthropic.com';
    } else {
      // デフォルトは OpenAI
      url.hostname = 'api.openai.com';
    }
    const newRequest = new Request(url, {
      method: request.method,
      headers: request.headers,
      body: request.body
    });
    const response = await fetch(newRequest);
    const newResponse = new Response(response.body, response);
    newResponse.headers.set('Access-Control-Allow-Origin', '*');
    return newResponse;
  }
};

/claude/v1/messages へのアクセスは Claude API に転送されます。

Gemini API プロキシ

Gemini のエンドポイントは generativelanguage.googleapis.com です。判定を 1 つ足すだけです。

if (url.pathname.startsWith('/gemini')) {
  url.pathname = url.pathname.replace('/gemini', '');
  url.hostname = 'generativelanguage.googleapis.com';
}

これで 1 つの Worker が 3 つの AI サービスをプロキシできます。

セキュリティのベストプラクティス

API Key をハードコードしない

チュートリアルによっては Worker コードに API Key を直書きしていますが、やめましょう。コードは平文保存され、誤共有のリスクもあります。

正しくは環境変数です。Worker 設定の「Variables and Secrets」で追加します。

  • 名前:OPENAI_API_KEY
  • 値:あなたの API Key
  • タイプ:「Secret」(暗号化保存)

コード側:

export default {
  async fetch(request, env) {
    // 環境変数から API Key を読み込む
    const apiKey = env.OPENAI_API_KEY;
    // リクエストヘッダーに API Key を付与
    const headers = new Headers(request.headers);
    headers.set('Authorization', `Bearer ${apiKey}`);
    // 以降は同じ...
  }
};

フロントから API Key を渡す必要がなくなり、より安全です。

カスタム認証トークンを足す

Worker URL が漏れたときの悪用を防ぐなら、簡単な認証を追加できます。

export default {
  async fetch(request, env) {
    // カスタム Token をチェック
    const authToken = request.headers.get('X-Custom-Auth');
    if (authToken !== env.MY_SECRET_TOKEN) {
      return new Response('Unauthorized', { status: 401 });
    }
    // 検証通過後、リクエスト処理を続行...
  }
};

環境変数 MY_SECRET_TOKEN を設定し、フロントからこのカスタムヘッダーを付けて呼び出します。

使用量を監視する

Cloudflare コンソールの Analytics で、日次リクエスト数・エラー率などを確認できます。無料枠に近づいたら早めに気づけるよう、定期的に見ておきましょう。

「Notifications」で、リクエスト数が 10 万回に近づいたらメール通知するルールも作れます。

よくある問題と対処

リクエストが遅い・タイムアウトする

極端に遅い場合、割り当てノードが最適でないことがあります。

対処:カスタムドメインをバインドする。DNS に合わせてルーティングが最適化され、無料の .workers.dev より速くなることが多いです。

Worker 設定の「Triggers」→「Add Custom Domain」でドメイン(例:api.yourdomain.com)を入力し、DNS レコードを追加します。

403 や 401 エラー

多くは API Key の問題です。

  1. 環境変数名とコード内の名前が一致しているか
  2. API Key が有効で残高があるか
  3. OpenAI / Claude に地域制限がないか(Workers はグローバルですが、一部ノードが制限対象と判定されることも)

デバッグ用にログを足します。

console.log('API Key:', env.OPENAI_API_KEY ? '設定済み' : '未設定');

Worker の「Logs」タブでリアルタイム確認できます。

無料枠が足りないとき

10 万回では足りない(商用など)場合は有料プランを検討します。

  • Workers 有料:月額 $5、1000 万リクエスト込み
  • 超過:100 万リクエストあたり $0.50

中規模アプリなら、VPS 自前よりコスト・運用の面で有利なことが多いです。

$5/月
有料プラン開始価格
1000 万回
有料プランリクエスト枠
$0.50
超過分(100 万回あたり)
Source: Cloudflare価格

最適化のヒント:

  1. フロントでキャッシュし、同じリクエストを繰り返さない
  2. バッチ API があればまとめて呼び、回数を減らす
  3. 開発中は Mock データを使い、本番 API を叩きすぎない

まとめ

Workers プロキシの強みは次の 3 点です。

  • コストゼロ:個人開発には十分な無料枠
  • ハードル低い:5 分で完了、コードは 30 行未満
  • リスク低い:API Key を安全に保管、漏洩を防げる

個人学習・デモ・小規模プロジェクトに向いています。安定した AI API アクセスを探しているなら、Workers を試してみてください。

今すぐ 1 つ作ってみましょう。記事をブックマークしておけば、困ったときにすぐ戻れます。ほかにハマった点があれば、コメントで教えてください。

参考になる OSS として、chatgptProxyAPIworker-openai-proxy はコードが読みやすく、GitHub で学ぶのに向いています。

いま AI API にはどんな方法でアクセスしていますか? コメントで教えてください。

FAQ

Cloudflare Workers の無料版で十分ですか?
個人開発や小規模プロジェクトには十分です。

無料版の枠:
• 1 日 10 万リクエスト
• 1 分あたり 1000 回
• 1 日 8 時間ぶっ続けで呼び出しても 2000 回程度

商用プロジェクトや高負荷の場面でのみ、有料版(月額 $5、1000 万リクエスト)を検討してください。
Workers プロキシは OpenAI 直結より遅くなりますか?
理論上は 50〜100ms の遅延が増えますが、体感ではほとんど変わりません。

メリット:
• Cloudflare は世界 300 超の CDN ノードを保有
• 地域によっては Workers 経由の方が OpenAI 直結より速いことも

カスタムドメインをバインドするとルーティングが最適化され、さらに速くなることがあります。
API Key の漏洩をどう防ぐ?
Cloudflare の環境変数(Secret タイプ)に API Key を保存し、フロントエンドには一切キーを書かないでください。

追加対策:
• カスタム認証トークン(X-Custom-Auth ヘッダー)を追加
• トークンを知るクライアントだけが呼び出せるようにする
• Worker URL の漏洩が心配なら、カスタムドメインと IP ホワイトリストを設定
Workers で OpenAI・Claude・Gemini を同時にプロキシできる?
はい、可能です。

パスプレフィックスでサービスを区別します:
• デフォルトパス → OpenAI
• /claude → Claude
• /gemini → Gemini

1 つの Worker で 3 大 AI サービスをまとめて扱え、コードは 50 行以下です。
Workers の利用状況とコストをどう監視する?
Cloudflare コンソールの Workers Analytics タブで確認できます:
• リクエスト数
• エラー率
• レスポンス時間など

Notifications ルールで、リクエスト数が 10 万回に近づいたらメール通知も設定可能です。

有料版では詳細なログとトレースも確認できます。

3分で読めます · 公開日: 2025年12月1日 · 更新日: 2026年6月8日

関連記事

コメント

GitHubアカウントでログインしてコメントできます