Hyperdrive は、Cloudflare Tunnel と Cloudflare Access を使い、プライベートデータベースへ安全に接続できます。
データベースがプライベートネットワーク(仮想プライベートクラウド ↗ やオンプレミスネットワークなど)に隔離されている場合、そのネットワークから Cloudflare への安全な接続を有効にする必要があります。
- Cloudflare Tunnel は、安全なトンネル接続を確立するために使います。
- Cloudflare Access は、特定の Hyperdrive 構成だけがトンネルへアクセスできるように制限するために使います。
Cloudflare Worker からオリジンデータベースへのリクエストは、Hyperdrive、Cloudflare Access、cloudflared が確立した Cloudflare Tunnel を経由します。cloudflared は、データベースへ到達できるプライベートネットワーク内で稼働している必要があります。
Cloudflare Tunnel は、プライベートネットワークから Cloudflare へ、双方向のアウトバウンド接続を確立します。Cloudflare Access は、その Cloudflare Tunnel を Hyperdrive 構成だけがアクセスできるように保護します。
すべてのチュートリアルは、Cloudflare Workers アカウント、C3 ↗、および Wrangler のセットアップが完了している前提です。セットアップは Get started ガイド で行います。
- プライベートネットワーク内のデータベース。TLS/SSL を使うように設定 されていること。
- Cloudflare アカウント上のホスト名。データベースへのリクエストのルーティングに使います。
まず、プライベートネットワーク内に Cloudflare Tunnel を作成し、ネットワークと Cloudflare の間に安全な接続を確立します。トンネルが Cloudflare ネットワークへ egress でき、ネットワーク内のデータベースへアクセスできるよう、権限を設定してください。
-
Cloudflare ダッシュボードにログインし、Networking > Tunnels を開きます。
Tunnels を開く ↗ -
Create a tunnel を選択します。
-
トンネルの名前を入力します。このトンネル経由で接続するリソースの種類がわかる名前(例:
enterprise-VPC-01)を推奨します。 -
Create Tunnel を選択します。
-
オペレーティングシステムを選び、インストールコマンドをコピーして、オリジンサーバーのターミナルで実行します。
-
トンネルの接続を待ちます。接続が確立したら Continue を選択します。
Hyperdrive がリクエストをルーティングできるよう、トンネルは Cloudflare 上の公開ホスト名を使うように設定する必要があります。まだ Cloudflare 上にホスト名がない場合は、先に 新しいホスト名を登録 するか、Cloudflare に ゾーンを追加 してください。
-
Published application routes タブで Domain を選び、サブドメインまたはパスを指定します。この値は、このトンネルへルーティングするために Hyperdrive 構成で使います。
-
Service セクションで、Type に
TCPを指定し、データベースの URL と設定済みポート(localhost:5432やmy-database-host.database-provider.com:5432など)を入力します。トンネルはこのアドレスで、リクエストをデータベースへルーティングします。 -
Save tunnel を選択します。
Cloudflare Tunnel へのアクセスを Hyperdrive に限定するには、有効な Service Auth トークン をリクエストに必須とする ポリシー を付けた Cloudflare Access アプリケーション を設定します。
Cloudflare ダッシュボードは、必要な Cloudflare Access アプリケーション、Service Auth トークン、ポリシー を自動で作成して設定できます。Access アプリケーションとポリシーを手動で作成することもできます。
自動作成
Cloudflare ダッシュボードで Hyperdrive 構成を作成すると、Cloudflare Tunnel への接続が自動で設定されます。
- Cloudflare ダッシュボード ↗ で Storage & Databases > Hyperdrive を開き、Create configuration をクリックします。
- Private database を選択します。
- Networking details セクションで、接続先のトンネルを選択します。
- Networking details セクションで、トンネルに関連付けられたホスト名を選択します。データベース用のホスト名がない場合は、1.2. 公開ホスト名でデータベースに接続する に戻ってください。
- Access Service Authentication Token セクションで Create new (automatic) を選択します。
- Access Application セクションで Create new (automatic) を選択します。
- Database connection details セクションで、データベースの name、user、password を入力します。
手動作成
サービストークンは、トンネルへのリクエストを制限するために使い、次の手順でも必要です。
-
Cloudflare ダッシュボード ↗ で Zero Trust > Access controls > Service credentials > Service Tokens を開きます。
-
Create Service Token を選択します。
-
サービストークンに名前を付けます。名前があると、ログ内の関連イベントを識別しやすく、トークンを個別に取り消せます。
-
Service Token Duration を
Non-expiringにします。これによりトークンは期限切れにならず、Hyperdrive 構成の存続期間中ずっと使えます。 -
Generate token を選択します。サービストークンの Client ID と Client Secret、およびそれぞれのリクエストヘッダーが表示されます。
-
Access Client ID と Access Client Secret をコピーします。Hyperdrive 構成の作成時に使います。
Cloudflare Access は、上で作成したサービストークンを使い、トンネルへのリクエストが Hyperdrive からのものであることを検証します。
-
Cloudflare ダッシュボード ↗ で Zero Trust > Access controls > Applications を開きます。
-
Create new application を選択します。
-
Self-hosted and private を選択します。
-
Add public hostname を選択し、トンネルアプリケーションに以前設定したサブドメインとドメインを入力します。
-
Create new policy を選択します。
-
Policy name を入力し、Action を Service Auth に設定します。
-
Include ルールを作成します。Selector を Service Token にし、Value に 2. サービストークンを作成する で作成したサービストークンを指定します。
-
ポリシーを保存します。
-
Identity providers で Accept all available identity providers をオフにし、すべての ID プロバイダーの選択を解除します。
-
Session Duration で
No duration, expires immediatelyを選択します。 -
(任意)Additional settings を開きます。Show application in App Launcher をオフにします。
-
Create を選択します。
プライベートデータベース向けの Hyperdrive 構成を作成するには、作成時に Access アプリケーションと Cloudflare Tunnel の情報を指定します。
# wrangler v3.65 and above required
npx wrangler hyperdrive create <NAME-OF-HYPERDRIVE-CONFIGURATION-FOR-DB-VIA-TUNNEL> --host=<HOSTNAME-FOR-THE-TUNNEL> --user=<USERNAME-FOR-YOUR-DATABASE> --password=<PASSWORD-FOR-YOUR-DATABASE> --database=<DATABASE-TO-CONNECT-TO> --access-client-id=<YOUR-ACCESS-CLIENT-ID> --access-client-secret=<YOUR-SERVICE-TOKEN-CLIENT-SECRET>resource "cloudflare_hyperdrive_config" "<TERRAFORM_VARIABLE_NAME_FOR_CONFIGURATION>" {
account_id = "<YOUR_ACCOUNT_ID>"
name = "<NAME_OF_HYPERDRIVE_CONFIGURATION>"
origin = {
host = "<HOSTNAME_OF_TUNNEL>"
database = "<NAME_OF_DATABASE>"
user = "<NAME_OF_DATABASE_USER>"
password = "<DATABASE_PASSWORD>"
scheme = "postgres"
access_client_id = "<ACCESS_CLIENT_ID>"
access_client_secret = "<ACCESS_CLIENT_SECRET>"
}
caching = {
disabled = false
}
}これにより、通常のデータベース情報(データベース名、データベースホスト、データベースユーザー、データベースパスワード)を使った Hyperdrive 構成が作成されます。
あわせて、サービストークンの Access Client ID と Access Client Secret も設定されます。Hyperdrive がトンネルへリクエストすると、Access がリクエストを傍受し、サービストークンの認証情報で検証します。
Cloudflare Tunnel と Access 経由のデータベース接続をテストするには、Hyperdrive 構成 ID を Worker で使い、デプロイします。
Worker を Hyperdrive 設定に接続するには、Wrangler 設定ファイル にバインディングを作成する必要があります。バインディング を使うと、Worker から Hyperdrive など Cloudflare 開発者プラットフォーム上のリソースにアクセスできます。
Hyperdrive 設定を Worker にバインドするには、Wrangler ファイルの末尾に次を追加します。
{
"hyperdrive": [
{
"binding": "HYPERDRIVE",
"id": "<YOUR_DATABASE_ID>" // the ID associated with the Hyperdrive you just created
}
]
}[[hyperdrive]]
binding = "HYPERDRIVE"
id = "<YOUR_DATABASE_ID>"具体的には次のとおりです。
binding(バインディング名)に設定した値(文字列)は、Worker 内でこのデータベースを参照するために使います。このチュートリアルでは、バインディング名をHYPERDRIVEにします。- バインディングは 有効な JavaScript 変数名 ↗ である必要があります。たとえば
binding = "hyperdrive"やbinding = "productionDB"は、どちらも有効なバインディング名です。 - バインディングは Worker 内の
env.<BINDING_NAME>で使えます。
開発中にローカルデータベースを使いたい場合は、Hyperdrive 設定に localConnectionString を追加し、データベースの接続文字列を指定します。
{
"hyperdrive": [
{
"binding": "HYPERDRIVE",
"id": "<YOUR_DATABASE_ID>", // the ID associated with the Hyperdrive you just created
"localConnectionString": "<LOCAL_DATABASE_CONNECTION_URI>"
}
]
}[[hyperdrive]]
binding = "HYPERDRIVE"
id = "<YOUR_DATABASE_ID>"
localConnectionString = "<LOCAL_DATABASE_CONNECTION_URI>"Workers からデータベースに接続でき、クエリを実行できることを確認します。
node-postgres ↗(pg)を使い、テストクエリを送って接続が成功したことを確認します。
node-postgres ドライバーをインストールします。
npm i pg@>8.16.3yarn add pg@>8.16.3pnpm add pg@>8.16.3bun add pg@>8.16.3TypeScript を使う場合は、型定義パッケージもインストールします。
npm i -D @types/pgyarn add -D @types/pgpnpm add -D @types/pgbun add -d @types/pg必要な Node.js 互換性フラグと Hyperdrive バインディングを、wrangler.jsonc ファイルに追加します。
{
// required for database drivers to function
"compatibility_flags": [
"nodejs_compat"
],
// Set this to today's date
"compatibility_date": "2026-09-20",
"hyperdrive": [
{
"binding": "HYPERDRIVE",
"id": "<your-hyperdrive-id-here>"
}
]
}compatibility_flags = [ "nodejs_compat" ]
# Set this to today's date
compatibility_date = "2026-09-20"
[[hyperdrive]]
binding = "HYPERDRIVE"
id = "<your-hyperdrive-id-here>"新しい Client インスタンスを作成し、Hyperdrive の connectionString を渡します。
// filepath: src/index.ts
import { Client } from "pg";
export default {
async fetch(
request: Request,
env: Env,
ctx: ExecutionContext,
): Promise<Response> {
// Create a new client instance for each request. Hyperdrive maintains the
// underlying database connection pool, so creating a new client is fast.
const client = new Client({
connectionString: env.HYPERDRIVE.connectionString,
});
try {
// Connect to the database
await client.connect();
// Perform a simple query
const result = await client.query("SELECT * FROM pg_tables");
return Response.json({
success: true,
result: result.rows,
});
} catch (error: any) {
console.error("Database error:", error.message);
return new Response("Internal error occurred", { status: 500 });
}
},
};次に、Worker をデプロイします。
npx wrangler deployデプロイした Worker にアクセスしたとき、データベースから pg_tables の一覧を受け取れたら、Hyperdrive は Cloudflare Tunnel と Cloudflare Access を使って、プライベートデータベースへ安全に接続できています。
mysql2 ↗ を使い、テストクエリを送って接続が成功したことを確認します。
mysql2 ↗ ドライバーをインストールします。
npm i mysql2@>3.13.0yarn add mysql2@>3.13.0pnpm add mysql2@>3.13.0bun add mysql2@>3.13.0wrangler.jsonc に、必要な Node.js 互換フラグと Hyperdrive バインディングを追加します。
{
// required for database drivers to function
"compatibility_flags": [
"nodejs_compat"
],
// Set this to today's date
"compatibility_date": "2026-09-20",
"hyperdrive": [
{
"binding": "HYPERDRIVE",
"id": "<your-hyperdrive-id-here>"
}
]
}compatibility_flags = [ "nodejs_compat" ]
# Set this to today's date
compatibility_date = "2026-09-20"
[[hyperdrive]]
binding = "HYPERDRIVE"
id = "<your-hyperdrive-id-here>"Hyperdrive のパラメーターを渡して、新しい connection インスタンスを作成します。
// mysql2 v3.13.0 or later is required
import { createConnection } from "mysql2/promise";
export default {
async fetch(request, env, ctx): Promise<Response> {
// Create a new connection on each request. Hyperdrive maintains the underlying
// database connection pool, so creating a new connection is fast.
const connection = await createConnection({
host: env.HYPERDRIVE.host,
user: env.HYPERDRIVE.user,
password: env.HYPERDRIVE.password,
database: env.HYPERDRIVE.database,
port: env.HYPERDRIVE.port,
// Required to enable mysql2 compatibility for Workers
disableEval: true,
});
try {
// Sample query
const [results, fields] = await connection.query("SHOW tables;");
// Return result rows as JSON
return Response.json({ results, fields });
} catch (e) {
console.error(e);
return Response.json(
{ error: e instanceof Error ? e.message : e },
{ status: 500 },
);
}
},
} satisfies ExportedHandler<Env>;次に、Worker をデプロイします。
npx wrangler deployデプロイした Worker にアクセスしたとき、データベースからテーブル一覧を受け取れたら、Hyperdrive は Cloudflare Tunnel と Cloudflare Access を使って、プライベートデータベースへ安全に接続できています。
トンネル経由でプライベートデータベースへ接続する Hyperdrive 構成で問題が起きた場合は、Hyperdrive の 一般的なトラブルシューティング手順 に加えて、次のよくある対処を確認してください。
- データベースが TLS(SSL)を使うように設定されていることを確認します。Hyperdrive の接続には TLS(SSL)が必要です。