AWS DMSでPostgreSQLの既存データを移行してみた(RDS to RDS)

AWS DMSを利用してRDSのPostgreSQLからRDSのPostgreSQLにデータを移行しました。

# 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/bbff7f9b-36c4-9420-dca5-a41572cfd3f8.png)



# 移行元DBの構成
移行元DBは以下のような構成です。
スキーマはデフォルトのもの(Public)を利用するとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/ebda3dc2-5a9c-73d6-20e2-d873b83c4e50.png)

# 前提条件
* 移行元RDSはPostgreSQL 11.12で、複数DBが存在する。
* 移行元RDSのデータは今後更新されることはない。
* 移行元RDSのデータを全て移行先RDSに移行する。
* 移行先RDSは新規構築したものを利用する。

# 作業内容
### 移行先RDSを新規構築
以下の流れで移行先RDSを新規構築しました。
後からデータベースを手動で作成するので、最初のデータベースは空にしました。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/6a120157-6bc2-b4f4-da67-a0e5327a1534.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/bf98a81f-16c5-8a12-d5bc-e783dfc5f530.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/fc7e1d22-1ec5-fd45-fa42-547fd551cfe6.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/8ff8a758-167c-ccbd-3862-59373a37a7e6.png)
  ![qiita-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/ce2359ca-34f9-1242-6afd-1203c35def32.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/a3adaca2-c19e-ae85-6fef-6c160d3766e9.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/2e28d0ee-a124-075a-7572-5201ab81b012.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/5e792b02-de1d-cc99-3196-194e3e05f8d9.png)

### 移行先RDSにDBを手動で作成する
移行先RDSにpsqlで接続して移行元RDSと同じ名前のDBを作成します。
今回は移行元RDSにDBが2つあるので、2つ作成します。
~~~
CREATE DATABASE sample_db1;
CREATE DATABASE sample_db2;
~~~
### セキュリティグループの用意
移行元RDSと移行先RDSにアタッチするセキュリティグループのインバウンドルールに以下の2つのルールを記載します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/f32666e7-bab5-c7f7-d14c-b7033ba68411.png)


### DMSでレプリケーションインスタンスを作成
AWS DMSでレプリケーションインスタンスを作成します。
セキュリティグループはインバウンドのルールはなし、アウトバウンドの設定はデフォルトの状態のものを利用しました。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/e832dbf0-fdec-a44a-da73-277ee24c1eb7.png)
  ![qiita-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/e683afbd-5993-0b2e-eb9d-d220bc1562c5.png)
  ![qiita-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/01fbd330-b48b-fa1f-1d5f-048d1b90d7e9.png)

### DMSでエンドポイントを作成
エンドポイントは以下の4つを作成する必要があります。
* ソースエンドポイント：移行元RDSのsample_db1用
* ソースエンドポイント：移行元RDSのsample_db2用
* ターゲットエンドポイント：移行先RDSのsample_db1用
* ターゲットエンドポイント：移行先RDSのsample_db2用

作成の流れは以下の通りです。
エンドポイントの作成の前にテストの実行をして、レプリケーションインスタンスから移行元RDSにアクセスできることを確認します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/d49af8eb-c5b4-8b81-b638-a3c4d193a1b7.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/d67248b9-2a73-f72e-fbd0-749345586652.png)
  ![qiita-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/8c2f282b-9464-3014-b234-75af4f64bdfa.png)

### データベース移行タスクを作成＆実行
4つのエンドポイントを作成したら、データベース移行タスクを作成して実行します。
移行元RDSにDBは2つありどちらのデータも移行するので、データベース移行タスクも2つ作成します。
  ![qiita-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/79a0b04d-5313-b872-f6f9-70841c6fee53.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/b29f4e6a-c533-8f03-5b69-c11e2c8d1ec6.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/281b551a-02c8-d16a-af93-b86fae1c4023.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/4179a6bb-f0b5-3b73-c079-2c11f5ee60dc.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/ae323fe5-b925-ab29-dd98-c7b1e74a20c5.png)

### 移行先DBの確認
2つのデータベース移行タスクのステータスが「ロード完了」になったら、移行先RDSにpsqlを使って接続し、DBやテーブル、データの数を確認します。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/e2d8283a-1385-72ed-d757-1bd36abd305b.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/40e4f214-daea-1179-2c55-b946893ae0f7.png)
 

# 想定外だったこと
* AWS DMSを使えば移行元DBクラスターを丸ごと移行できると思っていましたが、AWS DMSはDB単位でデータを移行する必要がありました
* AWS DMSでエンドポイントを作成する前に、移行先RDSに予めDBを作成しておく必要がありました。
* AWS DMSではロール(ユーザ)は移行できないので、移行先RDSに手動でロールを作るか、別の移行方法を考える必要があります。

# 参考
* Full-load task settings
https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TaskSettings.FullLoad.html

* Using a PostgreSQL database as an AWS DMS source
https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html

* Using a PostgreSQL database as a target for AWS Database Migration Service
https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html