CR2課の前田です。今回はDMSに関するお話を書きたいと思います。
概要
AWS Database Migration Service(DMS)のレプリケーションインスタンスをアップグレードする方法として、「サイドバイサイドアップグレード」があります。 新しいバージョンのレプリケーションインスタンスを別途作成し、既存のタスクを新インスタンスへ移動する方式です。
この方式では、旧インスタンスがそのまま残るので「何かあったら旧インスタンスに戻せばいいか」と思ってしまうのですが、実はそう簡単にはいきません。本記事では、サイドバイサイドアップグレードにおける切り戻しの制約について、実際に検証した結果を交えてお伝えします。
サイドバイサイドアップグレードとは
DMSのエンジンバージョンアップグレードには主に2つの方式があります。
| 方式 | 概要 | 備考 |
|---|---|---|
| インプレース | 既存インスタンスのバージョンを直接変更 | ダウングレード不可(例:3.6.1から3.5.4へのダウングレードは不可) |
| サイドバイサイド | 新バージョンのインスタンスを作成し、タスクを移動 | タスクを段階移行できるのでアップグレードによる障害が発生しても影響発生タスクを抑えることが可能 |
サイドバイサイド方式の流れは以下の通りです。
- 新バージョンのレプリケーションインスタンスを作成
- 既存タスクを停止
- 新インスタンスへタスクを移動
- タスクを再開
- 動作確認後、旧インスタンスを削除
旧インスタンスが残るので、「インプレースではダウングレード不可だけど、サイドバイサイドならタスクを移動し直して、実質的にダウングレード出来るのでは?」と思えますが、これは罠です。
タスク移動の制約
タスクの移動(move-replication-task API)には以下の制約があります。
The target replication instance must be created with the same or later DMS version as the current replication instance.
(移動先のレプリケーションインスタンスは、現在のレプリケーションインスタンスと同じかそれ以降のDMSバージョンで作成されている必要があります。)
要するに、新しいバージョンから古いバージョンへはタスクを移動できないということです。
上記ドキュメントには記載されているのですがサイドバイサイドアップグレードを紹介する公式ブログには記載されていないため、気付きにくいです。
実際に検証してみた
ドキュメントの記載だけだと淡泊なので、実際に検証しました。
検証環境
| リソース | 設定 |
|---|---|
| 旧インスタンス | dms-sqlserver-verify(エンジンバージョン: 3.5.4) |
| 新インスタンス | dms-sqlserver-verify-new(エンジンバージョン: 3.6.1) |
| タスク | 1個(full-load-and-cdc、SQL Server → SQL Server) |
やったこと
前提
旧インスタンス「dms-sqlserver-verify」と新インスタンス「dms-sqlserver-verify-new」が存在。

今回の移動対象タスクはこちら。

1. 新インスタンス(3.6.1)へタスクを移動
対象タスクを選択し、「アクション > 移動」を押下。

設定画面で新インスタンス「dms-sqlserver-verify-new」を指定して「データベース移行タスクの移動」を押下。

無事に移動されました!

2. 旧インスタンス(3.5.4)への切り戻しを試みる
ここで「やっぱり旧バージョンに戻したい」と思い、旧インスタンスへの移動を試みます。

設定画面ではそもそも旧インスタンスを指定することが出来ないため、移動し直しによる切り戻しは不可能だということが分かりました。

切り戻しが必要な場合
旧インスタンスへの移動ができない以上、切り戻しは「新インスタンス上でなんとかする」しかありません。具体的には以下の再開→再起動→再作成…の順番で対応することになります。
再開…最後に停止したポイントからタスクを再開します。すでに完全にロードされたテーブルはそのまま残されます。
再起動…最初からフルロードオペレーション(ソーステーブルから、0からデータ複製する)を再開します。ターゲットテーブルのデータは全て上書きされてしまいます。
再作成…タスクを削除して新規作成します。この場合、事前に削除前のタスク設定(タスク設定JSON、テーブルマッピング等)を記録しておき、新タスクでも同じ設定を実施する必要があります。
まとめ
- タスクの移動は同じか新しいバージョンのインスタンスにしかできない
- サイドバイサイドアップグレード後に旧インスタンスへタスクを戻すことはできない
- 切り戻しが必要な場合は、新インスタンス上で 再開 → 再起動 → 再作成 の順で対応する
サイドバイサイドだからといって切り戻しが簡単になるわけではないので、事前の準備をしっかり行った上で臨むことをお勧めします。 私のように引っかかる人が減らせれば幸いです!