🐥

Cloudflare HyperdriveでWorkersからAWS RDS Auroraにつなぐ

2023/12/07に公開

Cloudflare Hyperdriveとは

PostgreSQLなど既存のデータベースへのアクセスをWorkersに提供し、かつそこで実行されたクエリの結果をキャッシュしてパフォーマンスを向上させられる、というサービスです。

https://developers.cloudflare.com/hyperdrive/

RDS Auroraにつないでみる

今回はエンジンにAurora PostgreSQLを、サイズはServerless v2を使います。

Workersをデプロイする

なにがともあれWorkersが無いと始まらないのでHello worldをデプロイします。
デプロイすると、Hello worldが返却されるはずです。

npx wrangler login
npm create cloudflare@latest

Hyperdriveを追加する

今回はPostgreSQLを使うので、以下の公式ドキュメントを参考に進めていきます。

https://developers.cloudflare.com/hyperdrive/learning/connect-to-postgres/

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"}]

キャッシュについて

ドキュメントによるとデフォルトでクエリのキャッシュは有効のようです。

https://developers.cloudflare.com/hyperdrive/learning/query-caching/

2023/12/07時点では max_age=60 sec みたいです。60秒間キャッシュされます。

まとめ

Hyperdriveをセットアップして、RDS Auroraに接続するまでをまとめました。

データベースさえデプロイ済みであれば、いつものWorkersの開発に2ステップくらい追加でコマンドを実行するだけなのでかなり簡単だなと思います。

コネクションの管理はどうなっているのかな?というのはちょっと気になるところなので、そこは後々検証ですね。

Discussion