🐥
Cloudflare HyperdriveでWorkersからAWS RDS Auroraにつなぐ
Cloudflare Hyperdriveとは
PostgreSQLなど既存のデータベースへのアクセスをWorkersに提供し、かつそこで実行されたクエリの結果をキャッシュしてパフォーマンスを向上させられる、というサービスです。
RDS Auroraにつないでみる
今回はエンジンにAurora PostgreSQLを、サイズはServerless v2を使います。
Workersをデプロイする
なにがともあれWorkersが無いと始まらないのでHello worldをデプロイします。
デプロイすると、Hello worldが返却されるはずです。
npx wrangler login
npm create cloudflare@latest
Hyperdriveを追加する
今回はPostgreSQLを使うので、以下の公式ドキュメントを参考に進めていきます。
npx wrangler hyperdrive create my-aurora --connection-string="postgres://postgres:password@test-ins.test.ap-northeast-1.rds.amazonaws.com:5432/postgres"
結果はこちら
➤ npx wrangler hyperdrive create my-aurora --connection-string="postgres://postgres:password@test-ins.test.ap-northeast-1.rds.amazonaws.com:5432/postgres"
🚧 Creating 'my-aurora'
✅ Created new Hyperdrive config
{
"id": "1234",
"name": "my-aurora",
"origin": {
"host": "test-ins.test.ap-northeast-1.rds.amazonaws.com",
"port": 5432,
"egress_thru": "oxyEgressRouter",
"database": "postgres",
"user": "postgres"
},
"caching": {
"disabled": false
}
}
wrangler.tomlにHyperdriveを追加する
先ほど出力されたJSONをもとにwrangler.tomlに以下を追加します。
node_compat = true
[[hyperdrive]]
binding = "HYPERDRIVE"
id = "1234"
node-postgresでworkersから接続する
node-postgresのインストール
npm install pg
コードの修正
以下のようにコードを書き換えます。いつものnode-postgresパッケージを使うだけです。
src/index.ts
import { Client } from 'pg';
export interface Env {
HYPERDRIVE: Hyperdrive;
}
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
// ここでAuroraに接続
// 接続情報も露出しない、安心です
const client = new Client({ connectionString: env.HYPERDRIVE.connectionString });
try {
await client.connect();
const result = await client.query('SELECT name FROM users');
return new Response(JSON.stringify(result.rows));
} catch (e) {
return Response.json({ error: 'Error' }, { status: 500 });
} finally {
client.end();
}
},
};
デプロイ
あとはいつものようにデプロイするだけです。
npm run deploy
デプロイされたworkersのエンドポイントにアクセスすると、あらかじめ入れておいたusersテーブルのデータが出力されました。
[{"name":"test user"}]
キャッシュについて
ドキュメントによるとデフォルトでクエリのキャッシュは有効のようです。
2023/12/07時点では max_age=60 sec
みたいです。60秒間キャッシュされます。
まとめ
Hyperdriveをセットアップして、RDS Auroraに接続するまでをまとめました。
データベースさえデプロイ済みであれば、いつものWorkersの開発に2ステップくらい追加でコマンドを実行するだけなのでかなり簡単だなと思います。
コネクションの管理はどうなっているのかな?というのはちょっと気になるところなので、そこは後々検証ですね。
Discussion