AWS Database Migration Serviceがターゲットに Babelfish for Aurora PostgreSQL をサポートしたので試してみた

2022.07.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

先日のアップデートで、AWS DMS(Database Migration Service)の ターゲットエンドポイントで Babelfish for Aurora PostgreSQL がサポートされました。

本日はこちらの機能を使って、Azure SQL Database から Aurora PostgreSQL(Babelfish) へデータベースの移行を行ってみます。
一点注意事項があり、みんな大好き AdventureWorks で移行しようとしたところ、解決しなければならない問題が多すぎたので、今回は極力シンプルなデータベースとテーブルだけを移行しています。

ソースエンドポイントを用意する

パブリックアクセスを有効化した Azure SQL Database を作成し、適当なテーブルとレコードを作成しておきます。

CREATE TABLE [dbo].[hoge1](
    [HogeId] [tinyint] NOT NULL,
    [HogeName] [nvarchar](25) NOT NULL)

:

INSERT INTO [dbo].[hoge1](HogeId, HogeName) VALUES (1, 'aaa');
INSERT INTO [dbo].[hoge1](HogeId, HogeName) VALUES (2, 'bbb');
INSERT INTO [dbo].[hoge1](HogeId, HogeName) VALUES (3, 'ccc');
INSERT INTO [dbo].[hoge1](HogeId, HogeName) VALUES (4, 'ddd');
INSERT INTO [dbo].[hoge1](HogeId, HogeName) VALUES (5, 'eee');

当初はサンプルの AdventureWorks の移行を試みていたのですが挫折しました。
制約周りと、サポートされてないフィールドなど解決すべき事項が多く、本題から逸れ始めていたので中断しました。

Aurora側へDDLを流す際にCreateTable以外は作成せず、計算フィールドやIDENTITY列とBLOB列をどうにかすれば動きそうだったのですが、99%まで来て「失敗」の文字が表示されたのでやめました。

AWS DMSでレプリケーションインスタンスをパブリックで作成し、パブリックIPアドレスをSQL Databaseのファイアウォールへ登録します。

登録したら、AWS DMSでソースエンドポイントを作成します。
そーすいエンジンにMicrosoft Azure SQL Databaseを選択します。

テスト接続に成功すれば、Azure側は一旦OKです。

ターゲットエンドポイントを用意する

次にターゲットとなる、Aurora PostgreSQL を用意します。
ポイントとしては、テーブルと移行に使うユーザーアカウントを登録しておく必要があるという点です。

現時点では、Babelfishの場合はデータ移行タスクのターゲットテーブル作成モードが「何もしない」のみがサポートされているので、事前にテーブルだけ作成しておく必要があります。

Aurora PostgreSQL は本日時点での最新バージョン14.3を使い、インスタンスクラスはServerless v2を選択します。
もちろん、Babelfishを有効化しておきましょう。

USE my_database
GO
CREATE USER dms_user FOR LOGIN dms_user;
GO

:

GRANT SELECT, DELETE, INSERT, REFERENCES, UPDATE ON [dbo].[hoge1] TO dms_user;
GO

任意のデータベースに先程と同じDDLを使ってテーブルだけ作成しておき、セキュリティグループでこちらもレプリケーションインスタンスのアクセスを許可しておきましょう。
設定後にターゲットエンドポイントを作成します。

ポイントとしては、ターゲットエンジンにBabelfishを選択し、ポート番号で1433を指定します。

こちらも同じように、接続テストに成功すればエンドポイントの準備が完了です。

データ移行タスクの作成

レプリケーションインスタンスと、ソースエンドポイント、ターゲットエンドポイントが準備できたら、あとはデータ移行タスクを作成して移行を実行します。
注意点がいくつかあります。

まず、本日時点で Babelfish は CDC をサポートしていません。よって、移行タイプは「既存のデータを移行する」を選択する必要があります。

また、先程事前にAuroraでテーブルを作成しましたが、ターゲットテーブル作成モードは「何もしない」のみがサポートされています。
さらに、「完全LOBモード」もサポートされていないので、「LOG列を含めない」あるいは「制限付きLOBモード」を選択する必要があります。

今回はかなりシンプルなテーブルなのですが、今回だとソースエンドポイントが SQL Server ということによる制約を意識する必要があります。

さらに、ソースエンドポイントが SQL Server の場合は、SQL Server の機能としての Babelfish での互換性を意識する必要があります。
AdventureWorldの場合だと、いくつかの計算フィールドは現時点の Babelfish ではサポートされていませんでしたので、このあたりは事前に以前ご紹介した「Babelfish Compass」を使って、互換性の評価などを済ませた上で移行先テーブルの作成を行い、かつDMSの変換ルールを使ってうまいことやる必要がありそうです。

以下はシンプルなテーブルを移行した時のものです。
ここまで準備すると、あとは移行タスクの完了を待つだけですね。

さいごに

本日は、AWS DMS でターゲットエンドポイントに Babelfish for Aurora PostgreSQL 指定してみました。

使えるようにはなったのですが、AWS DMS特有の移行の下準備と、Babelfishの互換性問題から来る下準備がダブルで必要なので、なかなかでした。
また、本日時点ではCDCもサポートされていないので、ダウンタイムも意識する必要があります。
DMSでササッと簡単に移行できますねーとは言い難いですが、データベース移行の選択肢のひとつとして使えるということを覚えておきましょう。