[アップデート] Amazon Aurora DSQL に Ruby(pg gem)向けコネクターが追加され、IAM 認証の接続がシンプルになったので使ってみた

[アップデート] Amazon Aurora DSQL に Ruby(pg gem)向けコネクターが追加され、IAM 認証の接続がシンプルになったので使ってみた

2026.03.31

いわさです。

Amazon Aurora DSQL は AWS が提供するサーバーレスの分散 SQL データベースです。
Aurora DSQL ではすべての接続に IAM ベースの認証が必要で、時間制限付きのトークンを生成して接続する仕組みになっています。
このトークン管理がちょっと DSQL は面倒で、うまく再利用などしないと毎回トークン生成してパフォーマンスのボトルネックになる場合があります。

これまで Ruby から Aurora DSQL に接続する場合、従来は pg gem と aws-sdk-dsql を組み合わせて、トークン生成・SSL 設定・リージョン指定などを自分で管理する必要がありました。

先日のアップデートで、Aurora DSQL Connector for Ruby(pg gem)がリリースされました。

https://aws.amazon.com/about-aws/whats-new/2026/03/aurora-dsql-connector-for-ruby/

このコネクターは pg gem をラップしてるみたいなのですが、IAM トークンの自動生成、SSL 設定、コネクションプーリング、OCC(楽観的同時実行制御)リトライなどを組み込みで提供してくれるみたいです。かなり良さそうです。
これまで Python や Go、.NET、Node.js 向けのコネクターは既にリリースされていましたが、今回 Ruby が加わった形ですかね。

今回こちらを確認してみたので紹介します。

使い方

では早速コネクターを使ってみましょう。
以下のあたりのドキュメントを参考にしました。

https://docs.aws.amazon.com/aurora-dsql/latest/userguide/SECTION_program-with-dsql-connector-for-ruby-pg.html

https://github.com/awslabs/aurora-dsql-connectors/tree/main/ruby/pg

まず、従来の方法とコネクターを使った方法を比較してみます。
従来は pg gem と aws-sdk-dsql を使って以下のように書く必要がありました。

manual_token_test.rb
require "pg"
require "aws-sdk-dsql"

cluster_endpoint = "ivtvahlywbnhlbci5ujpzw5wja.dsql.ap-northeast-1.on.aws"
region = "ap-northeast-1"

# トークンジェネレーターを作成
token_generator = Aws::DSQL::AuthTokenGenerator.new(
  credentials: Aws::SharedCredentials.new
)

# トークンを生成
token = token_generator.generate_db_connect_admin_auth_token(
  endpoint: cluster_endpoint,
  region: region
)

# pg gem で直接接続
conn = PG.connect(
  host: cluster_endpoint,
  port: 5432,
  dbname: "postgres",
  user: "admin",
  password: token,
  sslmode: "verify-full"
)

result = conn.exec("SELECT 'Hello from Aurora DSQL!' AS greeting")
puts result[0]["greeting"]
conn.close

トークン生成、SSL モード、リージョン指定、ポート番号など、接続に必要なパラメータを全て自分で管理する必要があります。
これを今回のコネクターで行うと次のようになります。

connect_test.rb
require "aurora_dsql_pg"

conn = AuroraDsql::Pg.connect(host: "ivtvahlywbnhlbci5ujpzw5wja.dsql.ap-northeast-1.on.aws")
result = conn.exec("SELECT 'Hello from Aurora DSQL!' AS greeting")
puts result[0]["greeting"]
conn.close

これだけです。かなりシンプルになりますね。
IAM トークン生成、SSL 設定、リージョン検出がすべて自動で行われます。

使ってみた

では実際に接続やら試してみましょうか。
事前に東京リージョンでクラスターを作成しておきます。相変わらずクラスター作成はやすぎる。

B8E94B7B-0C26-4A43-8AB3-708E0F203AFC.png

aurora-dsql-ruby-pgをインストールします。
Gemfile に追加するか直接インストールします。今回は直接インストールしました。

% ruby --version
ruby 4.0.2 (2026-03-17 revision d3da9fec82) +PRISM [arm64-darwin25]

% gem install aurora-dsql-ruby-pg
Fetching pg-1.6.3-arm64-darwin.gem
Fetching connection_pool-3.0.2.gem
Fetching aws-eventstream-1.4.0.gem
Fetching aws-sigv4-1.12.1.gem
Fetching jmespath-1.6.2.gem
Fetching aws-partitions-1.1232.0.gem
Fetching aws-sdk-core-3.244.0.gem
Fetching aws-sdk-dsql-1.26.0.gem
Fetching aurora-dsql-ruby-pg-1.1.0.gem
Successfully installed pg-1.6.3-arm64-darwin
Successfully installed connection_pool-3.0.2
Successfully installed aws-eventstream-1.4.0
Successfully installed aws-sigv4-1.12.1
Successfully installed jmespath-1.6.2
Successfully installed aws-partitions-1.1232.0
Successfully installed aws-sdk-core-3.244.0
Successfully installed aws-sdk-dsql-1.26.0
Successfully installed aurora-dsql-ruby-pg-1.1.0
Parsing documentation for pg-1.6.3-arm64-darwin
Installing ri documentation for pg-1.6.3-arm64-darwin
Parsing documentation for connection_pool-3.0.2
Installing ri documentation for connection_pool-3.0.2
Parsing documentation for aws-eventstream-1.4.0
Installing ri documentation for aws-eventstream-1.4.0
Parsing documentation for aws-sigv4-1.12.1
Installing ri documentation for aws-sigv4-1.12.1
Parsing documentation for jmespath-1.6.2
Installing ri documentation for jmespath-1.6.2
Parsing documentation for aws-partitions-1.1232.0
Installing ri documentation for aws-partitions-1.1232.0
Parsing documentation for aws-sdk-core-3.244.0
Installing ri documentation for aws-sdk-core-3.244.0
Parsing documentation for aws-sdk-dsql-1.26.0
Installing ri documentation for aws-sdk-dsql-1.26.0
Parsing documentation for aurora-dsql-ruby-pg-1.1.0
Installing ri documentation for aurora-dsql-ruby-pg-1.1.0
Done installing documentation for pg, connection_pool, aws-eventstream, aws-sigv4, jmespath, aws-partitions, aws-sdk-core, aws-sdk-dsql, aurora-dsql-ruby-pg after 6 seconds
9 gems installed

A new release of RubyGems is available: 4.0.8 4.0.9!
Run `gem update --system 4.0.9` to update your installation.

なお、前提条件として Ruby 3.1 以上と、AWS CLI の認証情報が設定済みである必要とされています。[1]
ただ、私が最初試した時次のようにエラーメッセージが表示されたので、実質 Ruby 3.2 以上が必要そうです。

% gem install aurora-dsql-ruby-pg
Password:
Fetching aws-partitions-1.1232.0.gem
Fetching aws-sdk-core-3.244.0.gem
Fetching aws-sdk-dsql-1.26.0.gem
Fetching connection_pool-3.0.2.gem
Fetching jmespath-1.6.2.gem
Fetching aws-sigv4-1.12.1.gem
Fetching aws-eventstream-1.4.0.gem
Fetching base64-0.3.0.gem
Fetching pg-1.6.3-arm64-darwin.gem
Fetching aurora-dsql-ruby-pg-1.1.0.gem
ERROR:  Error installing aurora-dsql-ruby-pg:
        The last version of connection_pool (>= 2.4, < 4.0) to support your Ruby & RubyGems was 2.5.5. Try installing it with `gem install connection_pool -v 2.5.5` and then running the current command again
        connection_pool requires Ruby version >= 3.2.0. The current ruby version is 2.6.10.210.

インストールできたらあとはコードから使うだけ。まずは最もシンプルな接続から試してみます。

connect_test.rb
require "aurora_dsql_pg"

cluster_endpoint = "ivtvahlywbnhlbci5ujpzw5wja.dsql.ap-northeast-1.on.aws"

conn = AuroraDsql::Pg.connect(host: cluster_endpoint)

result = conn.exec("SELECT 'Hello from Aurora DSQL!' AS greeting")
puts result[0]["greeting"]

conn.close

実行してみました...が、失敗した。
AWS のSSL ルート証明書が見つからないですね。

% ruby connect_test.rb
/opt/homebrew/lib/ruby/gems/4.0.0/gems/pg-1.6.3-arm64-darwin/lib/pg/connection.rb:751:in 'PG::Connection::Pollable#polling_loop': connection to server at "2406:da14:1713:ba05:e526:ffb6:3622:ba1", port 5432 failed: root certificate file "/Users/iwasa.takahito/.postgresql/root.crt" does not exist (PG::ConnectionBad)
Either provide the file, use the system's trusted roots with sslrootcert=system, or change sslmode to disable server certificate verification.

        from /opt/homebrew/lib/ruby/gems/4.0.0/gems/pg-1.6.3-arm64-darwin/lib/pg/connection.rb:795:in 'PG::Connection#async_connect_or_reset'
        from /opt/homebrew/lib/ruby/gems/4.0.0/gems/pg-1.6.3-arm64-darwin/lib/pg/connection.rb:951:in 'PG::Connection.connect_to_hosts'
        from /opt/homebrew/lib/ruby/gems/4.0.0/gems/pg-1.6.3-arm64-darwin/lib/pg/connection.rb:871:in 'PG::Connection.new'
        from /opt/homebrew/lib/ruby/gems/4.0.0/gems/pg-1.6.3-arm64-darwin/lib/pg.rb:88:in 'PG.connect'
        from /opt/homebrew/lib/ruby/gems/4.0.0/gems/aurora-dsql-ruby-pg-1.1.0/lib/aurora_dsql_pg.rb:24:in 'AuroraDsql::Pg.connect'
        from connect_test.rb:7:in '<main>'

https://www.amazontrust.com/repository/AmazonRootCA1.pemから入手してもう一度試してみます。

% ruby connect_test.rb  
Hello from Aurora DSQL!

今度はうまくいきました。
AuroraDsql::Pg.connecthost を渡すだけで接続できていることがわかります。ホスト名からリージョンが自動検出されるので、リージョンの指定も不要です。便利だなこれは。

次に、コネクションプールを使ってテーブルの作成とデータの読み書きを試してみます。
AuroraDsql::Pg.create_pool でコネクションプールを作成し、pool.with ブロック内でコネクションを取得して操作しています。プールのデフォルトサイズは 5、タイムアウトは 5 秒です。

crud_test.rb
require "aurora_dsql_pg"

cluster_endpoint = "ivtvahlywbnhlbci5ujpzw5wja.dsql.ap-northeast-1.on.aws"

pool = AuroraDsql::Pg.create_pool(
  host: cluster_endpoint,
  occ_max_retries: 3
)

# テーブル作成(DSQL では UUID を主キーに使う)
pool.with do |conn|
  conn.exec("CREATE TABLE IF NOT EXISTS hogeusers (id UUID DEFAULT gen_random_uuid() PRIMARY KEY, name TEXT NOT NULL)")
end

# データ挿入(書き込みは transaction で囲む)
pool.with do |conn|
  conn.transaction do
    conn.exec_params("INSERT INTO hogeusers (name) VALUES ($1)", ["hoge"])
    conn.exec_params("INSERT INTO hogeusers (name) VALUES ($1)", ["fuga"])
  end
end

# データ取得
pool.with do |conn|
  result = conn.exec("SELECT id, name FROM hogeusers")
  result.each do |row|
    puts "#{row['id']} : #{row['name']}"
  end
end

pool.shutdown

実行結果は以下。データ作成後、マネコンのクエリエディタでも確認してみましょう。

% ruby crud_test.rb     
04848cd0-1916-43d2-a50f-72286995c750 : hoge
4f87f7ee-c51a-448e-acc5-5cf10f7bf2d7 : fuga

D1D92C71-8F09-42FE-B781-AB3AAEB2E1F0.png

設定オプション

コネクションのところでいくつかオプションを設定していましたが、以下のとおりカスタマイズが可能です。

オプション デフォルト 説明
host (必須) クラスターエンドポイントまたはクラスター ID
region (自動検出) AWS リージョン。host がクラスター ID の場合は必須
user "admin" データベースユーザー
token_duration 900(15分) トークンの有効期間(秒)
max_lifetime 3300(55分) コネクションの最大生存期間(秒)
occ_max_retries nil(無効) OCC リトライの最大回数
pool: { size: } 5 コネクションプールのサイズ

接続文字列形式もサポートされています。

connstr_test.rb
pool = AuroraDsql::Pg.create_pool(
  "postgres://admin@ivtvahlywbnhlbci5ujpzw5wja.dsql.ap-northeast-1.on.aws/postgres?profile=dev"
)

また、OCC リトライの設定できるのかなり良いですね。これは。
Aurora DSQL は楽観的同時実行制御(OCC)を採用しています。2 つのトランザクションが同じデータを変更した場合、先にコミットした方が勝ち、後からコミットしようとした方は OCC エラーを受け取ります。

コネクターでは occ_max_retries を設定することで、OCC 競合時に指数バックオフ付きで自動リトライしてくれます。

occ_retry_test.rb
cluster_endpoint = "ivtvahlywbnhlbci5ujpzw5wja.dsql.ap-northeast-1.on.aws"

pool = AuroraDsql::Pg.create_pool(
  host: cluster_endpoint,
  occ_max_retries: 3,
  logger: Logger.new(STDOUT)
)

pool.with do |conn|
  conn.transaction do
    conn.exec_params("UPDATE hogeusers SET name = $1 WHERE name = $2", ["piyo", "hoge"])
  end
end

めちゃくちゃ良くないですか、これは。

さいごに

本日は Amazon Aurora DSQL に Ruby(pg gem)向けコネクターが追加され、IAM 認証の接続がシンプルになったので使ってみました。

従来は pg gem と aws-sdk-dsql を組み合わせてトークン生成や SSL 設定を自分で管理する必要がありましたが、コネクターを使うとホスト名を渡すだけで接続できるようになり、コード量がかなり減りそうです。
また、コネクションプーリングや OCC リトライも組み込みでサポートされているので、本格的に利用する際にはむしろ使っていきたいですねこれは。

脚注
  1. Connecting to Aurora DSQL clusters with a Ruby connector - Amazon Aurora DSQL ↩︎

この記事をシェアする

FacebookHatena blogX

関連記事