はじめに
こんにちは、インサイトテクノロジーの松尾です!
昨年 re:Invent 2024 で発表され、ついに一般提供が開始された Amazon Aurora DSQL。日本の東京と大阪リージョンでも利用可能となり、まさに「待ってました!」という方も多いのではないでしょうか。
Aurora DSQL は、事実上無制限にスケールするサーバーレスな分散 SQL データベースです。3つのアベイラビリティゾーンにまたがる Active/Active の単一クラスタを提供しつつ、マルチリージョン構成が可能で、高いデータ一貫性を備えた読み取りと書き込みをサポートします。単一リージョンで99.99%、マルチリージョンで99.999%の可用性を実現するように設計されており、プロビジョニングやパッチ適用、アップグレードといったインフラ管理の負担から解放され、常に利用可能なアプリケーションの構築を強力にサポートします。PostgreSQLとの互換性も確保されており、使いやすい開発者エクスペリエンスを提供していることから、早速自社のアプリやサービスを移行したい!とお考えの方も多いのではないでしょうか?
しかし、このような新しいデータベースへの移行で多くのエンジニアが頭を悩ませるのが「互換性問題」です。特に、Aurora DSQL は PostgreSQL と互換性がある一方で、通常の PostgreSQL で利用可能な SQL 機能の一部 (多く?) がサポートされていないため、この互換性の確認は極めて重要になります。
なぜSQL互換性確認が必要なのか?
Aurora DSQL には、PostgreSQL との互換性がある一方で、現在サポートされていない機能が明確に存在します。
- サポートされていないオブジェクト:
- 単一クラスター上の複数データベース、一時テーブル、トリガー、シーケンス、パーティション、SQL以外の言語で記述された関数など。
- サポートされていない制約:
- 外部キー、排他制約など。
- サポートされていないコマンド:
- ALTER SYSTEM、TRUNCATE、SAVEPOINT、VACUUM (DSQLはバキューム処理を必要としない) など。
- サポートされていない拡張機能:
- PL/pgSQL、PostGIS、PGVector、PGAuditなど。
- サポートされていない SQL 式/構文:
- CREATE INDEX ASYNC、COLLATE句、AS SELECT句 (CREATE TABLE時)、CREATE TEMPORARY TABLES、CREATE EXTENSION、CREATE SEQUENCE、CREATE MATERIALIZED VIEW、CREATE TABLESPACE、CREATE TRIGGER、CREATE TYPE、CREATE DATABASEなど。
- その他の互換性制限:
- postgresという単一の組み込みデータベースのみ使用可能、UTF-8文字エンコード固定、UTCタイムゾーン固定、トランザクション分離レベルがRepeatable Readで固定、DDLとDMLの混在不可、トランザクションでの変更行数制限 (3,000行まで)、DB接続が1時間でタイムアウト、GRANT [permission] ON DATABASEの非サポートなど。
外部キーなど、基本的なオブジェクトでもサポートされていないものがありますし、PGAuditもサポートされていないため、現時点では監査ログも取得できず、本番利用にあたっては現時点では十分検討が必要だと思います。
また、行けそう!という判断になったとしても、これらのドキュメントに記載された変更点を全て把握し、これまで実行されてきた膨大なアプリケーションSQLが新しいバージョンや Aurora DSQL 環境で問題なく動作するかを、手動で全て洗い出すのは非常に困難で時間のかかる作業です。
※なお、上記の情報はブログ執筆時点での情報となりますので、最新情報はAWS公式ドキュメントを参照ください。
解決策はSQLテスト:Insight SQL Testing の活用
そこで、この互換性調査の解決策として、SQLテストツール「Insight SQL Testing」 をご紹介します。SQLテストとは、「これまで実行されていたSQLが、これまでと同じ結果を返すことを確認するテスト」です。
Insight SQL Testing は、以下の機能でSQLテストを効率的に実施できます。
- 現行環境からのSQL自動収集: 実際にアプリケーションが発行しているSQLを漏れなく集めます。
- 収集したSQLのテスト実行: テスト用DBに対してSQLを実行し、実行可否、実行結果(SELECT、更新DML)の比較、実行速度の比較を行います。
- テスト結果の確認・評価: サマリー画面で全体像を把握でき、さらに生成AIによるエラー説明や修正案の提示も可能です。
Insight SQL Testingは、Oracle Database、PostgreSQL、MySQLなど多様なDBエンジンに対応しており、異なるDBへの移行や、特にAuroraのメジャーバージョンアップ時のテストなどでの利用実績なども多いです。
実践!:RDS for PostgreSQL から Aurora DSQL への移行を想定してSQLテストを試す
Insight SQL Testing を使って、RDS for PostgreSQL からの移行を想定したSQL互換性移行アセスメントをどのように実施できるか、実際に試してみたいと思います。
以下のステップで行います。
- RDS for PostgreSQL からの実行SQL収集
- Aurora DSQL の起動
- SQLテストの実行
RDS for PostgreSQL からの実行SQL収集
まず RDS for PostgreSQL からの実行SQLの収集を行います。収集は、RDS for PostgreSQL で標準ログの出力を有効にし、それを取り込んでテストケースとします。
評価SQLセットの新規作成で、RDSのインスタンスを指定します。
新規作成を実行すると、実行したSQLの取り込みを確認できます。
※DBeaver から接続してテスト用のSQLをいくつか実行した例です
Aurora DSQL の起動
テスト用の環境として Aurora DSQL を起動して必要なスキーマを用意します。
なお、テスト用のテーブルとして、いつもテストで使用している pg-scott (SCOTTスキーマをPostgreSQLで利用可能にしたもの) を利用しようとしたところ、外部キーや、1トランザクション内での複数DDL使用など、そのままでは実行できませんでした。こういった基本的な構文でも注意が必要なことがわかります。
Aurora DSQL クラスタ自体の起動は非常に簡単で、いくつかのオプションを選択するだけで起動できます。
起動後に必要な接続先などの情報は、Get token から取得します。
この情報を使用すると、例えば DBeaver などのデータベースクライアントからも接続できます。
Aurora DSQL 起動時にはネットワークやセキュリティグループの指定がありませんでした。VPCに属さないサービスのようですね。
Insight SQL Testing のターゲットDBも同じ情報を使用して作成可能です。
SQLテストの実行
さて、評価SQLセット(テスト用のSQL)と、ターゲットDB(テストDB)がそろったら、アセスメント(テスト)を実行可能です。RDS for PostgreSQL用のターゲットDBも用意し、さっそくアセスメントを実行します。
アセスメントを実行すると、以下のように結果が表示されます。
エラーになったSQLを見てみると、一時テーブルをサポートしていないことによるエラーであることがわかります。
実行計画も確認できます。
また、Aurora DSQL ではバージョン情報を 16 と返すのは興味深いですね。
※左が RDS for PostgreSQL 16.9 で右が Aurora DSQL です。
今回はテスト用にいくつかのSQLを実行しただけですが、このようにまとめてSQLの互換性テストを実行できることが確認できました。
制限事項
なお、Aurora DSQL を Insight SQL Testing でターゲットDBとして使用する場合は以下の制限があります。
- Bedrockを活用したSQL修正のリコメンド機能は利用不可 (Aurora DSQL の情報を知らないため)
- アセスメントオプションにおける「DBへのデータ反映」オプションは「何もしない」のみ使用可能
- その他のオプションではPostgreSQLの「savepoint」を使用しているが Aurora DSQL では「savepoint」をサポートしていないため
これらの制限を認識の上、ぜひ試してみてください!
おわりに
本ブログでは、Aurora DSQL 利用における互換性問題の紹介と、Insight SQL Testing を使ったSQL互換性アセスメントについて紹介しました。ドキュメントに記載された変更点を全て把握し、これまで実行されてきた膨大なアプリケーションSQLが新しいバージョンや Aurora DSQL 環境で問題なく動作するかを、手動で全て洗い出すのは非常に困難で時間のかかる作業です。Aurora DSQL に移行したいけど「今までのアプリが動くかなぁ、、、」と互換性に不安を抱えていた方はぜひ Insight SQL Testing のようなツールの活用もご検討ください。
Insight SQL Testing へのお問合せはこちら ↓↓↓