第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=requireStep 2: Hyperdrive の作成(CLI)
Wrangler CLIを使ってHyperdrive設定を作成します。
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" } ]}型定義を自動生成します。
npx wrangler typesStep 4: Hono からのクエリ実装コード(src/index.ts)
軽量・高速なPostgreSQLドライバーである postgres(postgres.js)をインストールします。
npm install postgres honosrc/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のプールが稼働します。
npx wrangler deployデプロイされたURLへ連続してリクエストを送ってみます。
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消費されます。