DSQLへの接続に最適化されたコネクタがリリースされました!

DSQLへの接続に最適化されたコネクタがリリースされました!

Node.js/Python/JavaでDSQLを操作するのが簡単になるコネクタがAWS公式からリリースされました!
2025.11.27

リテールアプリ共創部@大阪の岩田です。

2025/11/21付けのアップデートでDSQLへの接続を簡素化する各種のコネクタがリリースされました。

https://aws.amazon.com/about-aws/whats-new/2025/11/aurora-dsql-statement-level-cost-estimates-query-plans/

2025/11/27本日時点では以下の言語とドライバ・ライブラリに対応しています。

  • Node.js
    • node-postgres
    • Postgres.js for Node.js
  • Python
    • psycopg
    • psycopg2
    • asyncpg
  • Java
    • PostgreSQL JDBC Driver

このブログでは例としてAurora DSQL Connector for node-postgresを取り上げて概要をご紹介します。

何がうれしいの?

PostgreSQL互換を謳うDSQLですが、通常のPostgreSQLと異なりDBに接続する際の認証には一時トークンを利用します。そのため、node-postgresのようなライブラリからDSQLを操作する際はDSQLへ接続する前にトークンを生成して利用するようなコードを書く必要がありました。例としてはこんな感じです。

import { Client } from 'pg'
import { DsqlSigner } from '@aws-sdk/dsql-signer';

const region = process.env.AWS_REGION;
const clusterEndpoint = `${process.env.DSQL_CLUSTER_IDENTIFIER}.dsql.${region}.on.aws`
const signer = new DsqlSigner({
      hostname: clusterEndpoint,
      region,
    });
const token = await signer.getDbConnectAdminAuthToken();
const client = new Client({
    host: clusterEndpoint,
    port: 5432,
    database: 'postgres',
    user: 'admin',
    password: token,
    ssl:true
  })
await client.connect();
...

別の例としてAWS Advanced NodeJS WrapperのDSQL用プラグインを書くブログなども紹介していました。

https://dev.classmethod.jp/articles/implements-aws-advanced-nodejs-wrapper-dsql-plugin/

今回リリースされたコネクタを使うとDSQLに接続するためのトークン生成が透過的に実行されるため、開発者側で自前実装すべきコードが削減できます。

やってみる

それではさっそくやっていきましょう。
今回はAurora DSQL Connector for node-postgresのREADMEを参考に試してみます。

https://github.com/awslabs/aurora-dsql-nodejs-connector/blob/main/packages/node-postgres/README.md

まずは各種ライブラリをインストール

npm install @aws/aurora-dsql-node-postgres-connector
npm install @aws-sdk/credential-providers @aws-sdk/dsql-signer pg tsx
npm install --save-dev @types/pg

AuroraDSQLClientを使ってDSQLにクエリを発行するコードを書きます。

main.ts
import { AuroraDSQLClient } from "@aws/aurora-dsql-node-postgres-connector";

const main = async ()=> {
    const client = new AuroraDSQLClient({
    host: "<DSQLのエンドポイント>",
    user: "admin",
    });
    await client.connect();
    const result = await client.query("SELECT NOW()");
    await client.end();
    console.log(result);
}

main()

トークンを生成するコードを自分で書く必要はなく、AuroraDSQLClientのコンストラクタ引数にDSQLのエンドポイントとDBユーザーの情報を渡すだけでクライアントが生成できます。あとは生成したAuroraDSQLClientのインスタンスを使った接続のOPEN/CLOSEやクエリ実行は通常のnode-postgresのClientクラスと同様に利用できます。DSQL固有のお作法の大部分が隠蔽されていて楽チンですね。

準備ができたので実行してみましょう。

tsx main.ts
Result {
  command: 'SELECT',
  rowCount: 1,
  oid: null,
  rows: [ { now: 2025-11-27T08:29:03.423Z } ],
  fields: [
    Field {
      name: 'now',
      tableID: 0,
      columnID: 0,
      dataTypeID: 1184,
      dataTypeSize: 8,
      dataTypeModifier: -1,
      format: 'text'
    }
  ],
  _parsers: [ [Function: parseDate] ],
  _types: TypeOverrides {
    _types: {
      getTypeParser: [Function: getTypeParser],
      setTypeParser: [Function: setTypeParser],
      arrayParser: [Object],
      builtins: [Object]
    },
    text: {},
    binary: {}
  },
  RowCtor: null,
  rowAsArray: false,
  _prebuiltEmptyResultObject: { now: null }
}

無事DSQLに接続してクエリが実行できました!

ちょっとコードを読んでみる

これだけで終わるのも寂しいので、せっかくなのでAurora DSQL Connector for node-postgresのコードを少し読んでみましょう。

といっても非常に「薄い」ライブラリなので、コードリーディングは割と簡単です。

AuroraDSQLClientとAuroraDSQLPool

まずはAuroraDSQLClientとAuroraDSQLPoolのコードです。それぞれnode-postgresのClientとPoolを継承したクラスになっており、DSQL固有の処理が実装されています。

やってることはシンプルでDSQLへの接続時にAuroraDSQLUtilクラスを使ってトークンを生成して基底クラスのpasswordに設定しています。

https://github.com/awslabs/aurora-dsql-nodejs-connector/blob/43e8bae03529d2c3f267f025f82e5d0c9e514980/packages/node-postgres/src/aurora-dsql-pool.ts#L34-L64

https://github.com/awslabs/aurora-dsql-nodejs-connector/blob/43e8bae03529d2c3f267f025f82e5d0c9e514980/packages/node-postgres/src/aurora-dsql-client.ts#L24-L45

AuroraDSQLUtilクラス

続いてAuroraDSQLUtilクラスのコードです。先程のAuroraDSQLClientAuroraDSQLPoolはこのクラスに依存しており、このクラスのgetDSQLTokenというメソッドでDSQL向けのトークンを生成しています。接続に使うユーザーがadminかどうかでgetDbConnectAdminAuthTokengetDbConnectAuthTokenを使い分けているのがポイントですね。

https://github.com/awslabs/aurora-dsql-nodejs-connector/blob/43e8bae03529d2c3f267f025f82e5d0c9e514980/packages/node-postgres/src/aurora-dsql-util.ts#L33-L73

parsePgConfigはその名の通り設定値をパースする処理です。node-postgresのparse処理に加えてDSQL固有の設定値であるリージョンとクラスターエンドポイントの情報を生成しています。

https://github.com/awslabs/aurora-dsql-nodejs-connector/blob/43e8bae03529d2c3f267f025f82e5d0c9e514980/packages/node-postgres/src/aurora-dsql-util.ts#-L105

個人的に面白かったのが、idleTimeoutMillismaxLifetimeSecondsをそれぞれnode-postgresのデフォルト値から変更している点です。

https://github.com/awslabs/aurora-dsql-nodejs-connector/blob/43e8bae03529d2c3f267f025f82e5d0c9e514980/packages/node-postgres/src/aurora-dsql-util.ts#L112-L113

DSQLには最大接続時間が60分までという制約があるので、これに対応するためのデフォルト値としてコネクタ側でデフォルト値を最適化してくれている感じですね。以前こんなブログを書きましたが、利用者がDSQLの制約に詳しくない場合でもエラーが発生しないようコネクタ側でよしなにやってくれるのは良いですね。

https://dev.classmethod.jp/articles/handle-dsql-maximum-connection-duration-by-pool/

まとめ

これでDSQLの操作が便利になりました。

コネクタはかなり「薄い」ライブラリなのでLambdaから利用する際もコールドスタートへの悪影響は非常に小さなものになります。DSQLを利用するユースケースでは積極的にコネクタを活用していきたいですね。

参考

この記事をシェアする

FacebookHatena blogX

関連記事