Aurora DSQL の IAM 認証が簡単に!Node.js Connector と Drizzle ORM で接続してみた

記事タイトルとURLをコピーする

はじめに

アプリケーションサービス本部ディベロップメントサービス1課の森山です。

直近、Amazon Aurora DSQL に関連するアップデートがあったので、ご紹介してみます。

IAM 認証を簡素化する Python、Node.js、JDBC Connector の提供

aws.amazon.com

まず、2025 年 11 月 21 日に、Aurora DSQL の IAM 認証がシンプルになるライブラリが公開されました。

Aurora DSQL は、時限式トークンを作成し、これをパスワードとして DSQL への接続を行うため、少し扱いが複雑でした。

今回公開されたライブラリを利用することで、他の PostgreSQL 互換データベースと同じように扱うことができるようになりました。

今回は公開されたライブラリの一つである、 Node.js Connector(aurora-dsql-nodejs-connector )を使って Node.js アプリケーションから Aurora DSQL に接続する方法を検証してみます。

合わせて、DSQL 関連の以下のアップデートも検証します。

AWS マネジメントコンソールに統合されたクエリエディタの提供

aws.amazon.com

こちらはマネジメントコンソール上から SQL を実行できるクエリエディタが搭載されたアップデートです。

コスト計算がしやすくなるアップデートです。

クエリプランでのステートメントレベルのコスト見積もり

aws.amazon.com

こちらはステートメントレベルのコスト見積もりが可能になったというアップデートです。 コスト見積もりに便利なアップデートですね。

試してみる

では、作ってみます。

今回は ORM に Drizzle を使って検証してみます。

orm.drizzle.team

なお、完成したソースは以下に格納しています。

github.com

エンドポイントの設定

まずは、任意の方法で DSQL のクラスターを作成しておき、パブリックエンドポイントを控えておきます。

パブリックエンドポイントは.envCLUSTER_ENDPOINTに設定しておきます。

CLUSTER_ENDPOINT=your-cluster-id.dsql.ap-northeast-1.on.aws
CLUSTER_USER=admin

テーブル作成

次に動作確認に利用する、ownerテーブルを作成します。

DDL は以下の通りです。

CREATE TABLE IF NOT EXISTS owner (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  name VARCHAR(30) NOT NULL,
  city VARCHAR(80) NOT NULL,
  telephone VARCHAR(20)
);

今回は新機能である、クエリエディタからテーブル登録を実施してみます。

クエリエディタはマネジメントコンソールの以下の場所から利用可能です。

まずはクラスターに接続します。

接続すると、以下のような画面になりテーブル確認したり、SQL を発行したりできます。

なお、紹介したリポジトリでは migrate スクリプトを用意しているので、pnpm migrate でもテーブル作成が可能です。

テーブル作成後は以下のように左側メニューより、テーブル構成の確認も可能です。便利ですね!

データベース操作

次に以下のソースで、データベース操作を実施してみます。

src/index.ts

import { AuroraDSQLClient } from "@aws/aurora-dsql-node-postgres-connector";
import { drizzle } from "drizzle-orm/node-postgres";
import { owner } from "./schema";
import { eq } from "drizzle-orm";
import "dotenv/config";

async function createDbConnection(clusterEndpoint: string, user: string) {
  const client = new AuroraDSQLClient({
    host: clusterEndpoint,
    user: user,
  });

  await client.connect();

  return {
    db: drizzle(client, { schema: { owner } }),
    client,
  };
}

async function main() {
  const clusterEndpoint = process.env.CLUSTER_ENDPOINT;
  const user = process.env.CLUSTER_USER || "admin";

  if (!clusterEndpoint) {
    throw new Error("CLUSTER_ENDPOINT environment variable is required");
  }

  const { db, client } = await createDbConnection(clusterEndpoint, user);

  try {
    console.log("Inserting data...");

    const [inserted] = await db
      .insert(owner)
      .values({
        name: "mori",
        city: "sapporo",
        telephone: "070-XXXX-XXXX",
      })
      .returning();

    console.log("Inserted:", inserted);

    const result = await db.select().from(owner).where(eq(owner.name, "mori"));
    console.log("Selected:", result);
  } catch (error) {
    console.error("Error:", error);
    throw error;
  } finally {
    await client.end();
  }
}

main();

コードの構成は以下の通りです。

createDbConnection関数では、AuroraDSQLClient を使って DSQL への接続を確立しています。hostuser を指定するだけで、IAM 認証トークンを意識する必要がありません。

接続後は Drizzle ORM のインスタンスを作成し、データベースクライアントと一緒に返却しています。

main 関数では、環境変数からクラスターエンドポイントとユーザー名を取得し、createDbConnection を呼び出して接続を確立します。

その後、insert でデータを挿入し、select でデータを取得する操作を実行しています。

動作確認

では、先ほどのソースをpnpm devスクリプトで実行してみます。

Inserting data...
Inserted: {
  id: '0f0b971c-69cf-44ef-9632-6ce527289601',
  name: 'mori',
  city: 'sapporo',
  telephone: '070-XXXX-XXXX'
}
Selected: [
  {
    id: '0f0b971c-69cf-44ef-9632-6ce527289601',
    name: 'mori',
    city: 'sapporo',
    telephone: '070-XXXX-XXXX'
  }
]

無事、データの挿入、取得ができてますね!

試しにクエリエディタでも確認してみます。

こちらも問題なさそうですね。

またクエリエディタでは、実行計画、もう一つの新機能である、ステートメント単位のコスト見積もりも確認できます。

DSQL の料金は$10.00 per 1M Unitsとなり、今回の場合、0.00133 DPU なので、100万回実行しても約 $0.0133(約1.3セント)程度です。

Statement DPU Estimate:
Compute: 0.00110 DPU
Read: 0.00023 DPU (Transaction minimum: 0.00375)
Write: 0.00000 DPU
Total: 0.00133 DPU

aws.amazon.com

Aurora DSQL Node.js Connector は何をしている?

次にaurora-dsql-nodejs-connectorは、どうやって認証トークンの複雑さを解決しているか、ソースコードを調査してみました。

接続時の自動トークン生成

DB 接続時に認証トークンを取得し、パスワードに指定してくれていました。

aurora-dsql-nodejs-connector/packages/node-postgres/src/aurora-dsql-client.ts

override async connect(callback?: (err: Error) => void) {
  if (this.dsqlConfig !== undefined) {
    try {
      this.password = await AuroraDSQLUtil.getDSQLToken(
        this.dsqlConfig.host!,
        this.dsqlConfig.user!,
        this.dsqlConfig.profile!,
        this.dsqlConfig.region!
      );
    } catch (error) {
      if (callback) {
        callback(error as Error);
        return;
      }
      throw error;
    }
  }
  // ...
}

client.connect()を呼ぶだけで、内部で自動的に IAM トークンを生成し、パスワードとして設定します。

トークン生成の仕組み

認証トークンはAuroraDSQLUtil.getDSQLTokenで生成されます。

AWS SDK の DsqlSigner を使って IAM 認証トークンを取得しています。

aurora-dsql-nodejs-connector/packages/node-postgres/src/aurora-dsql-util.ts

public static async getDSQLToken(
  host: string,
  user: string,
  profile: string,
  region: string,
  tokenDurationSecs?: number,
  customCredentialsProvider?: AwsCredentialIdentity | AwsCredentialIdentityProvider
): Promise<string> {
  let credential = customCredentialsProvider ?? fromNodeProviderChain({ profile });

  const signer = new DsqlSigner({
    hostname: host,
    credentials: credential,
    region: region,
    expiresIn: tokenDurationSecs,
  });

  if (user === "admin") {
    token = await signer.getDbConnectAdminAuthToken();
  } else {
    token = await signer.getDbConnectAuthToken();
  }

  return token;
}

まとめ

Aurora DSQL Node.js Connector により、TypeScript アプリケーションからの接続が大幅に簡素化されました。

aurora-dsql-nodejs-connector を使うだけで IAM 認証トークンを自動管理してくれるため、開発者はトークン管理を意識する必要がありません。

Drizzle ORM との組み合わせにより、型安全なデータベース操作が可能になります。

また、クエリエディタでテーブル操作や実行計画の確認が可能になり、ステートメントレベルのコスト見積もりで料金を事前に把握できるようになったのも嬉しいアップデートですね!

誰かのお役に立てば幸いです!

森山 智史 (記事一覧)

アプリケーションサービス本部ディベロップメントサービス1課

2025年10月中途入社。