AWS Database Migration ServiceのDB移行の設定

# DMS構築
データベース移行ツールのDMSは、DBのデータを含めた移行を自動化するツールです。
構成としては、「レプリケーション・インスタンス」(サーバーインスタンスタイプ)と「サーバレスレプリケーション」(サーバレスタイプ)があります。当記事では、構成がしやすいインスタンスタイプのフルロード(全データ移行)を例に説明します。続編として[AWS DMS CDC(差分反映構成)](https://qiita.com/AkioMotoki/items/e496f1cf602fe8244587)、[AWS DMS サーバレスレプリケーション](https://qiita.com/AkioMotoki/items/e496f1cf602fe8244587)の記事があります。これらの記事では、ソースがOracle、ターゲットがRDS for PostgreSQLの前提で解説します。
当検証で利用した移行用サンプルのDBの構成については、以下の記事をご参照ください。
[テスト用RDS for Oracleの管理と操作](https://qiita.com/AkioMotoki/items/aa4b8b3f3605b2410740)
[テスト用RDS for PostgreSQL](https://qiita.com/AkioMotoki/items/3ff8e1ba847bede81f7a)

## DMSの主要な設定
DMSの設定のうち、当構成において重要な要素は以下の通り。
①エンドポイント・・・対象DB(ソースとターゲット)への接続を定義
➁サブネットグループ・・・DMSのネットワーク定義
③レプリケーションインスタンス・・・DMSの移行サーバを含めたEC2インスタンス
④データベース移行タスク・・・③て実行する移行の方式を定義したタスク
上記以外にも、構成や問題判別のために必要な設定(ログ出力用のS3、CloudWatch、権限設定のためのIAMの定義等)があります。各手順中で記載します。

## エンドポイント
まず、変換前後のDBへの接続をエンドポイントに設定します。
### ソースDBへの接続
DMSのメニューの「エンドポイント」から「エンドポイントの作成」を選択し、ソースエンドポイントを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/54d327e5-7d54-f965-c32d-1378b7dfc6c9.png)
入力が終わったら、「エンドポイントの作成」で保管します。
エンドポイントの接続テストは、後述する「レプリケーションインスタンス」が利用できる場合に実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/06092edb-3193-a1e2-b0f8-1aac44583486.png)

        接続先のDB固有の確認や設定も必要です。[Using an Oracle database as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html)を参照してください。

### ターゲットDBへの接続
DMSのメニューの「エンドポイント」から「エンドポイントの作成」を選択し、ターゲットエンドポイントを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/d2dfca51-6833-af30-5685-dd48af4f1aa7.png)
入力が終わったら、「エンドポイントの作成」で保管します。
接続先のDB固有の確認や設定も必要です。[Using a PostgreSQL database as a target for AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html)を参照してください。

## サブネットグループ
DMSのメニューの「サブネットグループ」から「サブネットグループの作成」を選択し、名前、DMSから接続するDBが入ったサブネット、VPCを指定します。
### 差し替え予定 変更画面→新規登録画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/abc6ee94-00a2-13fb-774c-4fa5cf4c94d5.png)

## レプリケーションインスタンス
DMSのメニューの「データを移行する」から「レプリケーションインスタンス」を選択し、レプリケーションインスタンスの情報を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/6138c253-45a7-30e6-1001-d6407f354118.png)
できるまで、しばらく待ちます。(記事の環境では15分)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/1171844f-4eb8-0944-ee01-83d12fa220bf.png)
### エンドポイントの接続テスト
エンドポイント作成時にテストをしていなかった場合は、エンドポイントの設定かテストを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/6236e64d-2349-5a04-62f7-b6aa29154b9e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/985e0cfc-41c7-17e4-4ff5-3f8de052cb2f.png)


## データベース移行タスク
DMSのメニューの「データを移行する」から「データベース移行タスク」を選択し、「タスクの作成」を押し、データベース移行タスクを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/89d905f8-53a9-ca80-4fce-43817c96d9ce.png)

### データ移行のフルロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/87cd4d82-981d-8f10-7826-b9d195dc8966.png)

作成されるまで待機します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/8a8d05f1-eff0-8e05-6dde-1399eb56735e.png)
比較的すぐに終わります。(1-2分)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/c0740b9c-1788-8692-e68f-e4ed98d3aa7d.png)

タスクを開くと「概要の詳細」等が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/b9d41952-4a0d-1142-eb0c-677ee4e62390.png)

移行タスク作成の画面でスキップした「移行前評価」はここで作成ます。
DMS設定の流れを説明するため、実は前提として接続先のDBに対する追加の設定が必要で、これらの設定や確認が不足しているとエラーが発生する。


## 前提の設定
このケースでの設定内容については、投稿では細かく触れず、リンクの掲載に留めておく。
### ソースDB Oracleの確認と変更
[Using a PostgreSQL database as a target for AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.PostgreSQL.html)

### ターゲットDB RDS for PostgreSQLの確認と変更
[Using an Oracle database as a source for AWS DMS](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.Oracle.html)


# 移行前評価
前提の確認は、前述のリンクに記載の事項を確実に設定できれば良いのだが、細かい内容の確認には、移行前評価を利用すると便利である。
## 移行前評価の設定
移行前評価はログ出力にS3を使うため、S3バケットの定義、DMSがS3に書き込むためのIAMロールを設定の上、DMSに接続する必要がある。
## S3バケットの作成
管理コンソールからS3に移動し、「バケットの作成」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/634a77b9-796b-39da-15c2-c2f099c0a916.png)
DMSで書き込むためのバケットを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/cf1433b1-f462-759c-afd9-e5b8382d7078.png)
必要に応じて、フォルダーを作成しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/dbd1ba68-fae9-12af-b121-732ca77d1ccd.png)

## IAMの設定
AWSコンソールからIAMを選択
### ポリシーの作成
IAM > ポリシーからポリシーを作成します。
S3に書き込めるポリシーを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/0a700ee8-9d8f-719a-160c-ad037eed321a.png)
この画面では、全てのリソースにフルアクセスのポリシーを作ってます。ご利用になる環境に合わせて、細かく設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/50987aff-de20-7969-5847-fb49ff140c58.png)


## IAMロールの作成
IAM > ロールからロールを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/aa73643c-3815-5f97-9089-5760c2eb24cc.png)
AWSのサービスから「DMS」のサービス、「DMS」のユースケースを選択、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/8da39851-d08e-42db-157b-bbb08a18acf6.png)
前述のポリシーを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/d4f6f124-9fa3-87a4-3e47-3ad2818da7b2.png)
ロール名を指定して保管します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/9a4bf8de-a745-a588-e4cd-199c4cf1ea87.png)

## データベース移行タスクの変更
### DMS移行タスク
DMSの移行タスクを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/41b0f2c9-4ee6-64f2-7c7f-a8b33a72e1d0.png)

## 移行前評価の実行と確認
利用中の移行タスクを選択し、「移行前評価の作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/e13a6ccd-a531-791f-a74b-2c4681aa4be6.png)
移行前評価で使うS3バケットのパスとIAMロールを設定し、
移行用の評価を選択します。Prerequisiteと必須は追加しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/57ffe569-4048-ad67-ce60-79bb883d8771.png)
移行前評価実行中。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/5ddc9cf0-3c88-4b8d-1faa-428217dca37a.png)
移行前評価が終わった例。サマリー「1 failed 19 passed」が表示されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/97320c81-21f5-8070-a6b7-47cbd26c4407.png)

## エラーメッセージの対応例
サマリーをクリックすると、各評価の内容が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/8b27c071-1abd-2faa-f079-845a9863327d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/ad8c9e91-c3c0-f741-5ee1-58e12e524bb8.png)

エラーになっているメッセージをクリックすると対応方法が書かれており、これを元に対応する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/1aaf7d9c-20e8-c606-4239-253f4a52f429.png)


### ソース Oracle DBの拡張属性
```
alter table table_name add supplemental log data (PRIMARY KEY) columns;
exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD');
exec rdsadmin.rdsadmin_util.alter_supplemental_logging('ADD','PRIMARY KEY');
```
#### アーカイブログの時間
RDS Oracle のアーカイブログ保持を検証
Archived logs retention period is set to value lower than 24 hours, It is recommend to ensure that the source database is configured to retain archived logs for a sufficient time 24 hours is usually enough.
```
exec rdsadmin.rdsadmin_util.set_configuration('archivelog retention hours',24);
```

当記事の検証の環境の都合上、ソースのOracleはRDS for Oracleで構築しているため、この場合は操作手順が多少異なります。
#### CDC対応テーブル毎のエラー
通常サーバ
```
GRANT READ ON DIRECTORY ONLINELOG_DIR TO dms_user;
GRANT READ ON DIRECTORY ARCHIVELOG_DIR TO dms_user;
```
RDS用コマンド
```
exec rdsadmin.rdsadmin_master_util.create_onlinelog_dir;
exec rdsadmin.rdsadmin_master_util.create_archivelog_dir;
```
#### CDC対応テーブル毎のエラー
プライマリまたは一意のキーがあるテーブルで補足ロギングが有効になっているかどうかを検証
```
ALTER TABLE TBLnnnn ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
```
すべての列に補足ログが必要かどうかを検証します
```
ALTER TABLE TBLnnnn ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
```

対応を実施した後、移行前評価を実施し、全部がpassedになるまで対応する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/12b0829a-1286-b481-92d0-5bab541d1915.png)

### データベース移行タスクの実行
DMSのメニューの「データを移行する」から「データベース移行タスク」を選択し、作成した移行タスクを開き、「アクション」→「再起動/再開」でタスクを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/91f578e3-b13f-7404-88e6-a5b08ff8b3c4.png)
しばらく待機します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/9b3f83e1-0e03-c19b-2883-9c6277618c75.png)
### 終了とデータ反映の確認
検証環境では、移行データが少なかったため、1時間程度で終了しましたが、データが多い場合、もっとかかります。レプリケーションインスタンスの性能を上げればある程度解消されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/6c84eafc-2f3f-660b-f6f2-63cc85b81bc0.png)
移行タスクが正常に実行された場合、「テーブル統計」で各テーブルのデータ移行状況が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3802444/07e684c8-05fe-9053-3a3b-41a1a9a25c93.png)
また、ログを確認し、エラーが発生してないことも確認できます。
(実行したタスクの「概要の詳細」タブの「タスクログ」にあるCloudWatchログを表示のリンクより遷移

# 移行後の確認
移行後には、ターゲットDBにデータが移行されていることを、コマンドラインツール等で確認します。
筆者は、ツール(A5SQL)を使って確認した。