AWS Database Migration ServiceでオンプレDBからAmazon RDSへデータ移行してみた

# 1. はじめに
こんにちは。
今年7月、担当システムのデータベースをオンプレミスのOracleからAWS RDS for PostgreSQLに移行しました。
オンプレミスからクラウドへの移行、異種データベース間の移行はどちらも初めてで何もかもが手探り状態。
その際に救世主となった「AWS Database Migration Service」についてご紹介します。

# 2. AWS Database Migration Serviceとは
AWS Database Migration Service（以降DMSと記載）とは、データベース間でデータ移行するためのクラウドサービスです。

https://aws.amazon.com/jp/dms/

DMSを利用することで以下が実現出来ます。
* 移行処理が自動で実行される
* 移行プロセス中の高可用性と最小限のダウンタイムを維持して移行が可能
* 同種および異種データベースからの移行が可能
* 移行プロセス中に使用されたコンピュータリソースと追加のログストレージのみの支払いとなる

移行環境や処理を自前で用意する必要がないのに加え最低限のコストで済むため、移行初心者には大変ありがたいサービスです。

# 3. レプリケーションインスタンスとサーバーレス
DMSではレプリケーション（移行）にレプリケーションインスタンスを利用するかサーバーレスで実施するかを選ぶことが出来ます。
レプリケーションインスタンスを使用する場合、レプリケーションインスタンスがデータへの接続・読取・データフォーマット・書込を実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941080/8da0f472-7c44-4af0-8123-3104ac854ad0.png)

レプリケーションインスタンスを利用する場合はインスタンスクラスを指定する必要がありますが、サーバーレスを利用する場合はリソースが自動的にプロビジョニングされるため、インスタンスクラスの選定に悩む必要はありません。
ただしサーバーレスには制限もあるので、利用するケースに応じて使い分けが必要です。

今回はターゲットとなるデータベースのバージョンがサーバーレスのエンジンバージョンに対応していなかったため、レプリケーションインスタンスを選択しました。

# 4. 利用手順
ではレプリケーションインスタンスを使ったDMSの利用方法について、自身がちょっと悩んだりつまづいた点を中心にご説明します。

## 4.1. レプリケーションインスタンスの作成
まずは「DMS > レプリケーションインスタンス > レプリケーションインスタンスの作成」からレプリケーションインスタンスを作成します。

![instance1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941080/93d9acd6-3013-d6b9-5302-85fdbcc38944.png)

![instance2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941080/4a15b33d-3df3-defc-88ca-8ddcf8a25faf.png)

* **インスタンスクラス**
クラスによって移行にかかる時間が変わってきます
事前に何度かリハーサルを行い、予定時間内で移行が完了出来るクラスを選択しました
* **エンジンバージョン**
バージョンにより対応するデータベースバージョンなどが異なる場合があります
* **VPCセキュリティグループ**
ソースとターゲットのデータベースに接続出来る設定をしたセキュリティグループを設定します

設定が終わったら「レプリケーションインスタンスの作成」を押して完了です。

## 4.2. エンドポイントの作成
次にソースとターゲットのエンドポイントを「DMS > エンドポイント > エンドポイントの作成」から作成します。

**★ソース（移行元）**
![source1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941080/3c4a0c7a-425b-4ff0-8094-6a1835ff6913.png)
![source2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941080/98998a78-4a2d-8bfc-4553-6e7eb56d28b9.png)

**★ターゲット（移行先）**
![target1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941080/68a285ad-fa08-2ffe-1d5c-0e00d58edf3e.png)
![target2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941080/dcfbfb3d-bd76-87ad-e3a5-28b5986cdc39.png)

ソース、ターゲットともに接続情報を入力して「エンドポイントの作成」を押して完了です。
レプリケーションインスタンスを使用して接続テストも出来るため、必要があればテストを実施してください。

## 4.3. データ移行タスクの作成および実行
最後に「DMS > データ移行タスク > データ移行タスクの作成」から移行処理を実施するタスクを作成します。

![task1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941080/0ebec0c2-6109-7fac-0c39-ad6658ddad90.png)
![task2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941080/935c7279-da50-1264-ff1a-4249f55eb036.png)
![task3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941080/c03c2ab1-c900-7187-6813-f8b7e55cc4ee.png)

* **移行タイプ**
移行をどのように行うかを選択します
  * 既存のデータを移行する
1回限りの移行となります　※今回はこれを選択
  * 既存のデータを移行して、継続的な変更をレプリケートする
1回限りの移行後、変更されたデータをレプリケートします
  * データの変更のみをレプリケートする
1回限りの移行をせず、変更されたデータをレプリケートします
* **ターゲットテーブル準備モード**
ターゲットテーブルの扱いについて選択します。
  * 何もしない
ターゲットに存在するテーブルへデータ追加する
  * ターゲット上のテーブルを削除
ターゲットに存在するテーブルを削除して再作成して移行する
  * 切り捨て
ターゲットに存在するテーブル内のデータを削除してデータ追加する　※今回はこれを選択
* **LOB列設定**
ラージオブジェクト(LOB)の移行について選択します
  * LOB列を含めない
 LOBは移行されません
  * 完全LOBモード
LOBをすべて移行しますが時間がかかります　※今回はこれを選択
  * 制限付きLOBモード
最大LOBサイズまで移行します
* **データ検証**
ソースとターゲットの比較をするかどうかを選択します
今回はオフにして比較は自前で行いました
* **移行前評価を有効化**
移行タスク開始前に問題点のチェックを行うかを選択します
今回は事前にリハーサルを実施していたのでオフにしました
* **テーブルマッピング**
移行方法をカスタマイズすることが出来ます
例えばソースには移行不要のスキーマが存在していたので、移行対象から除外する設定をしました。
![change1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941080/4de94534-9448-7490-efc0-19c11167ed66.png)
ソースはテーブル名・項目名が大文字、ターゲットは小文字のため、小文字に変換する設定も行いました。
![change2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941080/1c46a41a-a879-5805-ec75-c301ff7f5015.png)

設定が終わったら「タスクの作成」を押して完了です。
これで移行タスクが実行出来るようになりました。

# 5. 移行タスクの実行
移行タスクを実行中、進捗を確認することが出来ます。
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3941080/e152491f-189a-d985-8a64-b46ec3aad20c.png)

進捗を見ていると以下の点に気がつきました。
* **テーブル名の昇順で移行される**
テーブル間で親子関係がある場合、順番によっては移行がエラーとなるテーブルが発生するので注意が必要です
今回は数テーブルでエラーが発生しましたがデータ量も少なかったため、対象テーブルは弊社の**DataSpider Servista**を使用して移行を実施しました

https://www.hulft.com/software/dataspider

* **複数テーブルが並行で移行される**
並行で移行が実施されても、データ量の多いテーブルが最後のほうに実行されるとロスタイムが発生します
場合によっては移行タスクを複数作成してテーブルをグループ分けすると効率が良さそうです


# 6. まとめ
DMSを利用することにより、データベース移行に関する専門的な知識がなくても簡単・スムーズにデータ移行を行うことが出来ました。
ちなみに本番データ移行にかかった時間およびコストは以下となります。どちらも最小限で収めることが出来ました。
* 時間　：5時間程度
* コスト：$6.26

また今回はご紹介していませんが、データベースオブジェクトの変換には「AWS Schema Conversion Tool(SCT)」というツールを利用しました。

https://aws.amazon.com/jp/dms/schema-conversion-tool/

こちらについてはまた機会があれば記事を書きたいと思います。