+ 作るログイン
図を読み込んでいます…
1 / 12
Cloudflare のすべて ― 1機能ずつ、仕組みと存在理由から / 全35本

Cloudflare 26:Hyperdrive ― 今あるデータベースに、Workers から速くつなぐ

発行
アニメモ公式
版
第1版
改訂
コマ
全12

Cloudflare Hyperdrive を、なぜ必要かから説明します。Workers から遠いデータベースにつなぐと遅い理由(接続の準備の往復と接続数の上限)、Worker の近くの入口と DB の近くの接続プール、問い合わせキャッシュ、導入とコード、料金と制限、落とし穴、D1 との選び方まで。

Workers から、今ある Postgres を使いたい

多くの会社には、すでにデータベースがあります。AWS や Google Cloud の上で動く Postgres や MySQL に、顧客・注文・商品のデータが何年分も入っていて、ほかの社内システムもそれを使っています。

そんな会社が Workers(18号)で新しい API や画面を作るとき、D1(23号)に移し替えるのは現実的ではありません。データはそのままで、Workers からつなぎたいのです。

ところが、Worker からふつうにデータベースへつなぐと、思った以上に遅くなります。理由は2つあります。

理由中身
距離Worker は利用者の近くで動くが、データベースは1か所にある
つなぎ直しWorker はリクエストのたびに、データベースへの接続を一から作る

1つめの距離は、どうしようもありません。問題は2つめです。次のページで見るとおり、データベースへの接続を作る「準備」には何往復もかかり、その1往復ずつに距離の遅さが掛け算されます。

この遅さを取り除くのが Hyperdrive です。既存の Postgres や MySQL に、Workers から速くつなぐための仕組みです。

※この号の内容は2026年9月時点の情報です。料金・上限・提供状況は変わることがあるので、使う前に必ず公式のドキュメントで確かめてください。

  • Cloudflare のすべて 26 ― Hyperdrive
  • 1 / 12
  • Workers から、今ある Postgres を使いたい
  • 遠い・毎回つなぎ直す
  • 利用者
  • Worker
  • Postgres
  • 利用者の近く
  • 既存の DB(1か所)
  • Worker は世界中で動くが、DB は1か所。距離は縮められない
  • しかも Worker は、リクエストのたびに DB への接続を一から作り直す
  • データはもう会社の DB にある。でも Worker からつなぐと遅い。

なぜ遅いのか:つなぐだけで何往復もする

データベースに問い合わせを送る前に、クライアントとデータベースは、いくつもの準備のやりとりをします。

段やりとり中身
1TCP の接続相手とつながるか確かめる(ネットワークのしくみの話)
2TLS の握手通信を暗号化するための鍵を決める
3認証ユーザー名とパスワードを確かめる。何往復かかかる
4問い合わせここでやっと SQL を送る

それぞれが1往復以上かかるので、合わせると7往復前後になることも珍しくありません。データベースまでの1往復が150ミリ秒なら、準備だけで1秒近くかかる計算です。

ふつうのサーバー(たとえば東京の EC2 で動く Node.js)は、この問題を接続を使い回すことで避けています。一度つないだ接続を、何百ものリクエストで使い続けるのです。

ところが Worker は、リクエストごとに短く動いて終わる仕組みです。リクエストが終わると、接続も捨てられます。つまり、毎回、準備の何往復をやり直すことになります。これが、Worker からデータベースにつなぐと遅い本当の理由です。

  • Cloudflare のすべて 26 ― Hyperdrive
  • 2 / 12
  • なぜ遅いのか:つなぐだけで何往復もする
  • 1. TCP
  • つながるか確かめる
  • 2. TLS
  • 暗号化の準備
  • 3. 認証
  • ユーザーとパスワード
  • 利用者
  • Worker
  • Postgres
  • 4. やっと問い合わせ
  • 利用者の近く
  • 既存の DB(1か所)
  • 遠い DB まで1往復 150ms なら、準備だけで 1秒近くかかることもある
  • ふつうのサーバーは接続を使い回すが、Worker はリクエストが終わると接続を捨てる
  • 問い合わせの前に、TCP・TLS・認証で何往復も。距離が掛け算になる。

もう1つの問題:DB の接続数が足りなくなる

遅さのほかに、もう1つ問題があります。接続の数です。

Postgres や MySQL は、同時に持てる接続の数に上限があります。接続1本ごとにメモリを使うので、小さめのデータベースなら数十から数百本程度です。

Worker は、アクセスが増えると、世界中の拠点で同時にたくさん動きます。そのそれぞれがデータベースに接続を作ると、どうなるでしょうか。

アクセス同時に動く Workerデータベースへの接続
少ない数個数本。問題なし
多い数百〜数千上限を超え、「too many connections」で断られる

アクセスが増えたときにこそ、データベースが接続を断ってサービスが止まる、という皮肉な事態になります。

従来は、データベースの前に 接続プール(PgBouncer など)を自分で立てて、接続の数をしぼっていました。でも、そのプールのサーバーを運用するのも手間ですし、Worker からプールまでの距離の問題は残ります。

  • Cloudflare のすべて 26 ― Hyperdrive
  • 3 / 12
  • もう1つの問題:DB の接続数が足りなくなる
  • Worker
  • Worker
  • Worker
  • Worker
  • 利用者
  • Worker
  • 接続がいっぱい
  • 利用者の近く
  • 接続数の上限に当たる
  • Postgres は、同時に持てる接続の数が決まっている(数百程度が多い)
  • アクセスが増えるほど Worker が増え、接続が溢れて「too many connections」
  • Worker は同時にたくさん動く。全部が DB に接続すると、DB が断る。

Hyperdrive:間に入って、接続を使い回す

Hyperdrive は、Worker とデータベースの間に入り、2つの問題をまとめて解決します。図の中の2つの箱が、その正体です。

箱置き場所役割
Hyperdrive の入口Worker と同じ拠点Worker からの接続を受ける。距離が短いので、準備が一瞬で済む
接続プールデータベースに近い拠点データベースへの接続をつなぎっぱなしで持ち、使い回す

Worker から見ると、Hyperdrive の入口がデータベースのように見えます。Worker は、すぐ近くの入口に対して準備のやりとりをするので、何往復しても時間はほとんどかかりません。

入口から接続プールまでは、Cloudflare の網の中を運びます。接続プールは、データベースとの接続をもう準備済みの状態で持っているので、届いた問い合わせをすぐに流せます。遠い距離を渡るのは、実際の問い合わせと結果だけです。

結果として、準備の何往復が、実質1往復になります。Cloudflare は、これを「データベースを Worker のすぐそばにあるように見せる」と説明しています。

  • Cloudflare のすべて 26 ― Hyperdrive
  • 4 / 12
  • Hyperdrive:間に入って、接続を使い回す
  • Cloudflare の網
  • 利用者
  • Worker
  • Hyperdrive 入口
  • 接続プール
  • Postgres
  • 利用者の近く
  • Worker と同じ拠点
  • DB の近く
  • 既存の DB(1か所)
  • Worker は近くの入口につなぐだけ。短い距離なので、準備が一瞬で済む
  • DB への接続は、DB の近くのプールがつなぎっぱなしにして使い回す
  • Worker の近くの入口と、DB の近くの接続プール。2つで速くする。

接続プール:温めた接続を、みんなで使い回す

接続プールの仕事を、もう少し詳しく見てみます。

プールは、データベースへの接続を数本だけ、つなぎっぱなしで持っています。Worker から問い合わせが届くと、空いている接続を1本借りて問い合わせを流し、結果が返ったら接続をプールに戻します。次の問い合わせは、また空いている接続を借ります。

項目Hyperdrive なしHyperdrive あり
接続の準備リクエストごとに一から準備済みの接続を借りるだけ
データベースへの接続数動いている Worker の数だけプールが持つ数本だけ
アクセスが急に増えたら接続が溢れるプールの中で順番待ちになる

Worker が何千個動いても、データベースから見える接続は、プールが持つ数本だけです。これで、接続数の上限の問題も解けます。

Hyperdrive のプールは、トランザクション単位で接続を貸し出します。1つのトランザクション(または1つの問い合わせ)が終わると、接続はプールに戻り、別の Worker に貸し出されます。この性質は、落とし穴のページで大事になります。

  • Cloudflare のすべて 26 ― Hyperdrive
  • 5 / 12
  • 接続プール:温めた接続を、みんなで使い回す
  • 問い合わせ
  • Cloudflare の網
  • 利用者
  • Worker
  • Hyperdrive 入口
  • 接続プール
  • Postgres
  • 利用者の近く
  • Worker と同じ拠点
  • DB の近く
  • 既存の DB(1か所)
  • プールは DB への接続をつなぎっぱなしで持ち、届いた問い合わせを空いた接続に流す
  • 入口からプールまでは Cloudflare の網で運ぶ。遠くても準備のやり直しが無い
  • DB への接続は数本で済む。Worker が何千あっても溢れない。

問い合わせキャッシュ:同じ読み取りは、近くで答える

Hyperdrive には、もう1つの工夫があります。問い合わせキャッシュです。

商品の一覧やカテゴリーの一覧のように、同じ読み取りが何度も繰り返されることはよくあります。Hyperdrive は、読み取り(SELECT)の結果を、Worker の近くの拠点でしばらく覚えておきます。同じ問い合わせがもう一度来たら、データベースまで行かずに、その場で結果を返します。

項目中身
対象読み取りの問い合わせ(SELECT)
対象外書き込み(INSERT・UPDATE・DELETE)、トランザクションの中など
覚えている時間既定では60秒。設定で変えられる(最長1時間ほど)
切るHyperdrive の設定ごとに、キャッシュを無効にできる

キャッシュで答えれば、遠いデータベースまでの往復がまるごと無くなります。データベースの負荷も減ります。

一方で、覚えている間は、データベースが変わっても古い結果が返ることに注意が要ります。在庫数や残高のように、常に最新が必要な値を読むときは、キャッシュを切った別の Hyperdrive 設定を作って使い分けます。

  • Cloudflare のすべて 26 ― Hyperdrive
  • 6 / 12
  • 問い合わせキャッシュ:同じ読み取りは、近くで答える
  • ← 結果
  • キャッシュ
  • Cloudflare の網
  • 利用者
  • Worker
  • Hyperdrive 入口
  • 接続プール
  • Postgres
  • 利用者の近く
  • Worker と同じ拠点
  • DB の近く
  • 既存の DB(1か所)
  • 読み取り(SELECT)の結果を、既定では60秒ほど覚えておく(設定で変えられる)
  • 書き込み(INSERT・UPDATE)はキャッシュせず、必ず DB へ届く
  • SELECT の結果をしばらく覚える。DB まで行かずに返る。

導入:接続文字列を登録し、バインドする

Hyperdrive を使い始める手順です。

順番やることコマンドや場所
1データベースを外からつなげるようにし、Hyperdrive 用のユーザーを作るデータベースの管理画面
2接続文字列を Hyperdrive に登録するnpx wrangler hyperdrive create my-db --connection-string="postgres://..."
3表示された ID を設定に書くwrangler.jsonc
4コードを書いてデプロイnpx wrangler deploy

設定ファイルは次のようになります。Postgres のドライバは Node.js の機能を使うので、nodejs_compat を有効にします。

jsonc
{
  "compatibility_flags": ["nodejs_compat"],
  "hyperdrive": [
    { "binding": "HYPERDRIVE", "id": "(hyperdrive create で表示された ID)" }
  ]
}

接続文字列(ユーザー名とパスワードを含む)は、Hyperdrive の側に暗号化して保存されます。コードや設定ファイルには、ID だけが残ります。

データベースをインターネットに公開したくない場合は、社内ネットワークから Tunnel(15号)で Cloudflare につなぎ、その先のデータベースに Hyperdrive からつなぐこともできます。手元で wrangler dev を使うときは、設定の localConnectionString に手元のデータベースを書いておきます。

  • Cloudflare のすべて 26 ― Hyperdrive
  • 7 / 12
  • 導入:接続文字列を登録し、バインドする
  • DB を用意
  • hyperdrive create
  • 設定に書く
  • デプロイ
  • DB の準備
  • 外から入れる設定と、専用のユーザー
  • hyperdrive create
  • 接続文字列を登録する。ID が表示される
  • wrangler.jsonc
  • hyperdrive にバインディング、nodejs_compat
  • 外に出したくない DB は、Tunnel(15号)経由でもつなげる
  • wrangler で作ると ID が出る。パスワードはコードに書かない。

使い方:いつもの pg ドライバに、接続文字列を渡すだけ

Hyperdrive の良いところは、コードがふつうの Postgres のコードとほとんど同じことです。

ts
import { Client } from "pg";

export default {
  async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
    // リクエストごとにクライアントを作る(入口が近いので速い)
    const client = new Client({ connectionString: env.HYPERDRIVE.connectionString });
    await client.connect();

    const id = new URL(request.url).searchParams.get("id");
    const { rows } = await client.query("SELECT id, name, price FROM products WHERE id = $1", [id]);

    // 応答を返した後で、接続を閉じる
    ctx.waitUntil(client.end());
    return Response.json(rows);
  },
};

env.HYPERDRIVE.connectionString は、Hyperdrive の入口を指す接続文字列です。これをドライバに渡すだけで、あとはいつもどおりです。$1 のように値を別に渡す書き方で、SQL インジェクションを防ぎます。

データベース使えるドライバの例
Postgrespg(node-postgres)、postgres(Postgres.js)
MySQLmysql2
どちらもDrizzle や Prisma などの ORM(接続文字列を渡す)

MySQL にも対応しているので、MySQL の会社でも同じように使えます。

  • Cloudflare のすべて 26 ― Hyperdrive
  • 8 / 12
  • 使い方:いつもの pg ドライバに、接続文字列を渡すだけ
  • import { Client } from "pg";
  • const client = new Client({ connectionString: env.HYPERDRIVE.connectionString });
  • await client.connect();
  • const { rows } = await client.query("SELECT * FROM products WHERE id = $1", [id]);
  • ctx.waitUntil(client.end());
  • return Response.json(rows);
  • ドライバは pg・postgres(Postgres)や mysql2(MySQL)など、いつものもの
  • ORM(Drizzle・Prisma など)も、接続文字列を渡せばそのまま使える
  • コードはふつうの Postgres と同じ。env から接続文字列を取る。

料金と制限:無料プランでも使える

Hyperdrive は、Workers の無料プランでも使えます。2025年に無料プランでも使えるようになりました。無料プランでは、1日にできる問い合わせの数に上限があります。Workers の有料プランでは、Hyperdrive はプランに含まれ、問い合わせの数による追加料金はかかりません(2026年9月時点)。

項目中身
無料プラン使える。1日の問い合わせ数に上限がある
有料プランWorkers 有料プランに含まれる
データベースへの接続数Hyperdrive の設定ごとに、プールが持つ接続の本数に上限がある
対応するデータベースPostgres と MySQL、それらと互換のもの(多くのクラウドの DB サービス)

注意したいのは、データベース自体の料金は別だということです。データベースを置いているクラウドの利用料や、データベースから外に出る通信の料金は、そのクラウドで今までどおりかかります。キャッシュで答えられる問い合わせが増えるほど、データベースの負荷と外への通信は減ります。

接続の本数の上限は、データベース側の上限より少なめに設定するのが安全です。ほかのシステムも同じデータベースに接続しているはずだからです。

※2026年9月時点の情報です。料金・上限は変わるので、公式の Pricing と Limits のページで確かめてください。

  • Cloudflare のすべて 26 ― Hyperdrive
  • 9 / 12
  • 料金と制限:無料プランでも使える
  • 無料プラン
  • 使える。1日の問い合わせ数に上限
  • 有料プラン
  • Workers 有料プランに含まれる
  • DB への接続
  • 設定ごとに接続の本数の上限
  • DB の料金
  • DB 自体の料金は、DB の事業者へ
  • 対応する DB
  • Postgres・MySQL と、その互換のもの
  • DB から外に出る通信の料金は、DB を置いているクラウドでかかることがある
  • 2026年9月時点。料金・上限は変わるので公式の Pricing / Limits で確かめる
  • 無料は1日の問い合わせ数に上限。有料は Workers のプランに含まれる。

よくある落とし穴

Hyperdrive でつまずきやすい点です。

落とし穴何が起きるかどうするか
書いた直後の読み取りキャッシュの古い結果が返ることがある最新が必要な読み取りは、キャッシュを切った設定を使う
接続の状態に頼るSET で変えた設定や一時テーブルが、次の問い合わせで消えている接続は使い回し。状態に頼らず、必要なら1つのトランザクションの中で済ませる
グローバルにクライアントを作るリクエストをまたいで使うと、エラーや詰まりの原因になるリクエストごとに作り、ctx.waitUntil(client.end()) で閉じる
何度も往復する処理1回のリクエストで問い合わせを何十回も送ると、そのたびに遠くまで往復するJOIN やまとめた問い合わせで回数を減らす
広すぎる権限漏れたときの被害が大きいHyperdrive 専用のユーザーを作り、必要な表と操作だけ許す

4つめは見落としやすい点です。Hyperdrive は準備の往復を無くしますが、問い合わせそのものは遠いデータベースまで行きます(キャッシュで答えられない限り)。1回のリクエストで何十回も問い合わせる書き方だと、その回数ぶん遅くなります。

データベースの置き場所も考えましょう。利用者のほとんどが日本にいるなら、データベースも日本に近い地域に置くのが基本です。

  • Cloudflare のすべて 26 ― Hyperdrive
  • 10 / 12
  • よくある落とし穴
  • 書いた直後に読むと、キャッシュの古い値が返る → 必要ならキャッシュを切る
  • SET や一時テーブルに頼る → 接続は使い回し。次の問い合わせでは別の接続
  • Worker の外(グローバル)でクライアントを作る → リクエストごとに作る
  • 1回のリクエストで何十回も問い合わせる → 回数ぶん遠くまで往復する
  • DB には Hyperdrive 専用のユーザーを作り、必要な権限だけ渡す
  • キャッシュで古い値。接続の状態は持ち越せない。往復は減らす。

D1 か、Hyperdrive か

Workers から SQL を使う道は、D1(23号)と Hyperdrive の2つです。選び方の軸は「データがもうどこかにあるか」です。

比べる点HyperdriveD1
データの場所今ある Postgres / MySQLCloudflare の中
準備データベースを用意して登録するコマンド1つ
大きさデータベース次第1つあたりに上限
機能Postgres の拡張機能なども使えるSQLite の範囲
運用自分か、データベースの事業者Cloudflare に任せる
共有ほかのシステムと同じデータを使える基本は Workers から使う

既存のシステムがあり、データを動かしたくないなら Hyperdrive です。これから新しく作る小さなアプリなら、D1 が手軽です。

ほかの号とのつながりも挙げておきます。データベースを公開したくないときは Tunnel(15号)で社内とつなぎ、Workers(18号)から使います。遅い書き込みを後回しにするなら Queues(24号)、Hyperdrive の作成や一覧は Wrangler(34号)の wrangler hyperdrive コマンドで行います。

  • Cloudflare のすべて 26 ― Hyperdrive
  • 11 / 12
  • D1 か、Hyperdrive か
  • Hyperdrive
  • D1(23号)
  • 今ある Postgres / MySQL を使う
  • Cloudflare の中の SQLite
  • データを動かさずに Workers へ
  • 準備ゼロ。運用も任せられる
  • 他のシステムと同じ DB を共有
  • 利用者ごとに DB を分けやすい
  • DB の運用は自分か事業者
  • 1つあたりの大きさに上限
  • つながり:Workers(18号)・Tunnel(15号)・Wrangler(34号)
  • データが既にあるなら Hyperdrive。新しく小さく作るなら D1。

まとめ:遠い DB を、近くにあるように

この号で見たことをまとめます。

項目内容
なぜ要るのかWorkers から既存の Postgres / MySQL に直接つなぐと遅く、接続も溢れる
遅い理由接続の準備に何往復もかかり、Worker は毎回つなぎ直す
入口Worker と同じ拠点で接続を受ける。準備が一瞬で済む
接続プールデータベースの近くで、準備済みの接続を使い回す
キャッシュ読み取りの結果を近くで覚える。既定は60秒ほど
使い方env.HYPERDRIVE.connectionString をいつものドライバに渡す
料金無料プランでも使える。有料プランに含まれる
注意キャッシュの古さ。接続の状態は持ち越せない。問い合わせの回数を減らす

次の27号では、Workers では動かせない重い処理や、好きな言語のプログラムを動かせる Containers を見ます。

  • Cloudflare のすべて 26 ― Hyperdrive
  • 12 / 12
  • まとめ:遠い DB を、近くにあるように
  • キャッシュ
  • Cloudflare の網
  • 利用者
  • Worker
  • Hyperdrive 入口
  • 接続プール
  • Postgres
  • 利用者の近く
  • Worker と同じ拠点
  • DB の近く
  • 既存の DB(1か所)
  • 既存の Postgres / MySQL を、コードをほとんど変えずに Workers から速く使う
  • 無料で試せる。キャッシュの古さと、使い回しの接続の性質だけは覚えておく
  • 準備は近くの入口で。接続はプールで使い回し。読み取りはキャッシュ。

0 件のコメント

読み込み中…

権利侵害・不適切な内容の連絡: [email protected]