コンテンツにスキップ

第18章: Hyperdrive による既存DBエッジ高速化(実践チュートリアル)

エッジコンピューティング(Cloudflare Workers)から東京リージョンや米国にある外部のPostgreSQL/MySQLへ接続する際、最大のボトルネックは 「TCP/TLSハンドシェイクの往復遅延」「サーバーレスからの接続過多によるコネクション枯渇」 です。

Hyperdrive は、世界330拠点以上のCloudflareエッジにデータベースのコネクションプールとインテリジェントクエリキャッシュを自動配置し、接続遅延を最大10分の1に激減させます。


本チュートリアルのゴール

  • wrangler hyperdrive create によるHyperdrive設定の新規作成
  • wrangler.jsonc へのバインディングと postgres.js によるクエリ実行
  • 接続プールによるレスポンス時間の大幅な短縮効果の検証
【接続アーキテクチャの比較】
[通常のエッジ接続]
Workers ──(毎回TCP/TLS確立・遅延150ms〜300ms)──> [ 東京リージョンのDB ]
[Hyperdrive経由]
Workers ──(最寄りエッジでプール再利用・遅延10ms〜30ms)──> Hyperdrive ──(常時キープアライブ)──> [ 東京リージョンのDB ]

Step 1: 既存データベースの接続文字列の準備

Neon、Supabase、AWS RDS、GCP Cloud SQLなど、手持ちのPostgreSQLデータベースの接続URIを用意します。

postgres://USER:PASSWORD@HOST.example.com:5432/DB_NAME?sslmode=require

Step 2: Hyperdrive の作成(CLI)

Wrangler CLIを使ってHyperdrive設定を作成します。

Terminal window
npx wrangler hyperdrive create my-pg-hyperdrive \
--connection-string="postgres://postgres:my-secret-password@db.supabase.co:5432/postgres?sslmode=require"

出力例:

✅ Successfully created Hyperdrive configuration 'my-pg-hyperdrive'
id: "a1b2c3d4e5f678901234567890abcdef"

出力された id をメモしておきます。


Step 3: wrangler.jsonc へのバインディング

{
"name": "hyperdrive-api",
"main": "src/index.ts",
"compatibility_date": "2024-09-01",
"compatibility_flags": [
"nodejs_compat"
],
"hyperdrive": [
{
"binding": "HYPERDRIVE",
"id": "a1b2c3d4e5f678901234567890abcdef"
}
]
}

型定義を自動生成します。

Terminal window
npx wrangler types

Step 4: Hono からのクエリ実装コード(src/index.ts

軽量・高速なPostgreSQLドライバーである postgres(postgres.js)をインストールします。

Terminal window
npm install postgres hono

src/index.ts を作成します。

import { Hono } from 'hono';
import postgres from 'postgres';
type Bindings = {
HYPERDRIVE: Hyperdrive;
};
const app = new Hono<{ Bindings: Bindings }>();
app.get('/api/users', async (c) => {
const start = Date.now();
// Hyperdriveが最適化したローカルソケット接続文字列を取得
const sql = postgres(c.env.HYPERDRIVE.connectionString, {
max: 1, // エッジ側は1接続指定でOK(Hyperdriveが背後で接続をプール)
fetch_types: false,
});
try {
// クエリの実行
const users = await sql`
SELECT id, name, email, created_at
FROM users
ORDER BY id DESC
LIMIT 10;
`;
const duration = Date.now() - start;
return c.json({
latencyMs: duration,
count: users.length,
data: users,
});
} catch (error: any) {
return c.json({ error: error.message }, 500);
} finally {
// 接続の終了(Hyperdrive側でキープアライブされます)
await sql.end();
}
});
export default app;

Step 5: デプロイとレイテンシの検証

ローカル環境では直接DBへ接続されますが、エッジにデプロイするとHyperdriveのプールが稼働します。

Terminal window
npx wrangler deploy

デプロイされたURLへ連続してリクエストを送ってみます。

Terminal window
curl https://hyperdrive-api.xxxx.workers.dev/api/users

結果:

  • 初回アクセス(接続確立): 約120ms
  • 2回目以降(Hyperdriveプール再利用): 約15ms〜25ms

既存のRDBへの接続が、まるで同一ネットワーク内にあるかのような超高速レスポンスへと変貌します。


まとめ

  • コード変更最小: 接続文字列を c.env.HYPERDRIVE.connectionString に差し替えるだけ。
  • コネクション枯渇ゼロ: 何万ものサーバーレスリクエストが同時に来ても、Hyperdriveが適切な接続数に集約して安全に中継。

💡 用語解説コラム

[!NOTE] コネクションプール (Connection Pool)
都度データベースへの接続を開閉せず、あらかじめ確立した接続を再利用する仕組み。サーバーレスからのアクセス急増によるDBダウンを防ぎます。

[!NOTE] TLSハンドシェイク遅延
暗号化通信を開始する際にクライアントとサーバー間を往復(RTT)して鍵を交換する時間。地球の裏側のDBへ接続するとこれだけで数百ms消費されます。