[アップデート] Ruby アプリから Amazon Aurora のフェイルオーバーを速くする「AWS Advanced Ruby Driver Wrapper」が GA になったので使ってみた
いわさです。
AWS には Amazon RDS / Aurora 向けのデータベース接続に特化した「Advanced Driver Wrapper」というデータベース接続ドライバーが提供されています。
既存のドライバーを内部で包括しているラッパーで、アプリケーション側の互換性のある程度保ったまま Aurora のフェイルオーバー時の再接続を速くしたり、IAM 認証や Secrets Manager 認証を追加したりできます。
これまで JDBC(Java)、Python、NodeJS、Go、.NET、ODBC 版が提供されていましたが、先日のアップデートで Ruby 版が GA になりました。
Ruby 版は pg(PostgreSQL)と mysql2(MySQL)のラッパーになっています。
ActiveRecord 向けには aws_postgresql / aws_mysql2 というアダプタが用意されていて、database.yml のアダプタ名を書き換えるだけでアプリのコードはそのままに使えるようです。
今回こちらを確認してみたので紹介します。
Advanced Driver Wrapper でフェイルオーバーを検証してみる
まず Aurora PostgreSQL クラスターを 1 つ用意しました。
バージョンは 17.6、Writer と Reader の 2 インスタンス構成です。

gem は aws_advanced_ruby_driver_wrapper という名前で、RubyGems を見ると 1.0.0 が GA アナウンスと同じ 2026 年 10 月 5 日に公開された初版でした。プレビュー版があったのか調べてみたのですが、最初のバージョンがそのまま GA になってるっぽく見えます。
wrapper を使うには Ruby 3.3 以上が必要です。
ローカルの Ruby で gem を 2 つインストールします。
gem install aws_advanced_ruby_driver_wrapper pg
接続は 2 通りあります。
ActiveRecord を使う場合は database.yml の adapter を aws_postgresql にするだけ、pg を直接使う場合は PG::Connection の代わりに WrapperPgConnection を使います。
今回は後者の、pg を直接使う形で試します。
接続先にはクラスターエンドポイント(xxxx.cluster-xxxx.ap-northeast-1.rds.amazonaws.com)を指定します。
今回は Failover Plugin を使って、フェイルオーバー時にクエリが復旧するまでの時間を標準の pg と比べてみます。
wrapper_plugins に failover を含めると Failover Plugin が有効になります(指定しない場合も failover と initial_connection がデフォルトで読み込まれます)。
require "aws_advanced_ruby_driver_wrapper/postgresql"
conn = AwsAdvancedRubyDriverWrapper::WrapperPgConnection.new(
host: "xxxx.cluster-xxxx.ap-northeast-1.rds.amazonaws.com",
dbname: "hogedb",
user: "hogeadmin",
password: "<password>",
sslmode: "verify-full",
sslrootcert: "rds-global-bundle.pem",
wrapper_plugins: "failover,initial_connection",
failover_timeout_sec: 60.0
)
WrapperPgConnection は PG::Connection と同じように exec などが呼べます。
検証では、1 秒ごとに SELECT pg_is_in_recovery(), inet_server_addr() を実行して、接続先の IP と Writer/Reader の別を出力し続けるスクリプトにしました。
なお sslrootcert に指定している rds-global-bundle.pem は RDS の証明書バンドルで、接続時の TLS 証明書検証で使うのでこちらのページからダウンロードしておく必要があります。
ではスクリプトを動かした状態で、failover-db-cluster でクラスター側でフェイルオーバーを発生させてみますか。
aws rds failover-db-cluster --db-cluster-identifier hoge-ruby-wrapper
ログがこうなりました。
[10:06:20.370] ok ro=f ip=172.31.16.117
INFO -- AwsAdvancedRubyDriverWrapper: Starting writer failover
INFO -- AwsAdvancedRubyDriverWrapper: [1] Writer verified: hoge-ruby-wrapper-2.xxxx.ap-northeast-1.rds.amazonaws.com
INFO -- AwsAdvancedRubyDriverWrapper: [1] Writer found: hoge-ruby-wrapper-2.xxxx.ap-northeast-1.rds.amazonaws.com
[10:06:26.840] FAILOVER SUCCESS: reconnected to new writer
[10:06:27.884] ok ro=f ip=172.31.1.214
フェイルオーバーが始まると wrapper が通信エラーを検知して、Starting writer failover のログが出ていますね。
そのあと新しい Writer(hoge-ruby-wrapper-2)を特定して接続をし直して、FailoverSuccessError をスローしてます。
接続先の IP も、旧 Writer の 172.31.16.117 から新 Writer の 172.31.1.214 に切り替わっていますね。
この FailoverSuccessError は、エラーという名前ですが「フェイルオーバーに成功して新しい Writer につなぎ直せた」という例外なので、そのまま中断されたクエリを再実行するようにアプリ側で実装してやればいいんだと思います。
FailoverSuccessError — Failover succeeded outside a transaction. Reconfigure session state, then replay the last statement.
今回検証した結果では中断から復旧まで約 6 秒でした。
標準の pg の場合でもフェイルオーバーさせてみる
比較のため、同じループを標準の pg の PG::Connection で動かして、同じようにフェイルオーバーさせてみました。
WrapperPgConnection を PG.connect に変えただけで、ほかは同じです。
[10:07:42.497] ok ro=t ip=172.31.16.117
[10:07:43.553] ERROR PQconsumeInput() SSL error: unexpected eof while reading
[10:08:19.997] recovered after 36.4s ro=f ip=172.31.16.117
こちらはフェイルオーバー後、クエリが復旧するまで約 36 秒かかりました。
標準の pg はクラスターエンドポイントにつなぎっぱなしなので、新しい Writer を自分で探しにいけず、クラスターエンドポイントの DNS が新しい Writer を指すよう更新されるまで再接続を試み続けるためそれだけ時間がかかる感じっぽいです。
なお、別のタイミングで試したときは、たまたま同じインスタンスが Reader から Writer に昇格したケースに当たり、そのときは約 10 秒で復旧しました。
昇格のパターンによって復旧時間が変わるので、結構幅がありますね。
さいごに
本日は AWS Advanced Ruby Driver Wrapper が GA になったので、Aurora PostgreSQL のフェイルオーバーを Failover Plugin ありで試してみました。
標準の pg が最大 36 秒かかったフェイルオーバー復旧が、wrapper だと 6 秒ほどで済みました。
アプリ側は接続クラスを WrapperPgConnection に変えるだけ(ActiveRecord ならアダプタ名を変えるだけ)で、クエリを書くコードはそのままで使えるので移行しやすくて良いですね。
Ruby / Rails で Aurora を使っていて、フェイルオーバー時のダウンタイムを縮めたい場合はぜひ試してみてください。








