AWS Database Migration Service(DMS)でDb2をS3に一括移行＆(CDC的な)継続的レプリケーションする

# はじめに

AWS Database Migration Service（以下、DMS）の設定方法や挙動を確認する目的で、Db2にあるデータをS3に連携できるかどうかを試した記録です。

# 前提

実施環境として、データソースとなるDb2はCloud Pak for Data上にデプロイされたものを使用しました。

    Cloud Pak for Data：Version 4.7
    Openshift：Version 4.12
    Cloud：IBM Cloud
    （外部公開用のPublic Load Balancer IPを使用して接続）

[こちら](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Introduction.Sources.html#CHAP_Introduction.Sources.title)を見ると2024年3月1日現在DMSがデータソースとして対応しているDb2のバージョンが確認できます。

    - IBM DB 2 for Linux、UNIX、および Windows (Db2 LUW) 
        - バージョン 9.7、すべてのフィックスパック
        - バージョン 10.1、すべてのフィックスパック
        - バージョン 10.5、フィックスパック 5 を除くすべてのフィックスパック
        - バージョン 11.1、すべてのフィックスパック
        - バージョン 11.5 Mods (1～8)、フィックスパック 0 のみ
    - IBM Db2 for z/OS
        - バージョン 12
    - Amazon RDS for IBM Db2 LUW

用意したDb2環境は上記の対応製品・バージョンに該当していないような気もしましたが、そこはあまりこだわらず試しています。

参考：[DMSのAWS公式](https://aws.amazon.com/jp/dms/)

# ゴール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/1fd08099-ca2f-1c21-27e4-e047b08d8c62.png)

# 実施手順

- DMS Subnet Groupを作成する
    - サブネットグループの作成を選択
    - VPC、サブネットを選択
- レプリケーションインスタンスを作成する
    - インスタンス、ストレージ、接続とセキュリティの設定を行う
- ソース側のDMSエンドポイントを作成する
    - エンドポイントの作成を選択
    - エンドポイントを設定
    - 接続テストの実施
- ターゲット側のDMSエンドポイントを作成する
    - エンドポイントの作成を選択
    - エンドポイントを設定
    - 接続テストの実施
- データベース移行タスクを作成する
    - データ移行タスクを設定
    - データ連携対象となるスキーマ名、テーブル名を指定
    - 補足：対象となるテーブルおよびレコード格納状況
    - タスクの実行（ここでは前述の移行タスクの設定によりタスク作成直後に自動実行される）
- 断面データ（全量）の連携内容を確認する
    - ターゲットとなるS3の確認
        - S3にオブジェクトが配置されたことの確認
        - オブジェクトの中身の確認
- 更新差分データの連携内容を確認する
    - INSERT
        - SQL実行
        - S3にオブジェクトが配置されたことの確認
        - オブジェクトの中身の確認
    - UPDATE
        - SQL実行
        - S3にオブジェクトが配置されたことの確認
        - オブジェクトの中身の確認
    - DELETE
        - SQL実行
        - S3にオブジェクトが配置されたことの確認
        - オブジェクトの中身の確認

# やってみた
- DMS Subnet Groupを作成する
    - サブネットグループの作成を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/7f69ead2-6970-d9e0-3938-fa3b8b59c305.png)

    - VPC、サブネットを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/ef68f187-f1e4-e9d7-6e98-e4252bc61039.png)

- レプリケーションインスタンスを作成する
    - インスタンス、ストレージ、接続とセキュリティの設定を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/4b73a30d-cc87-f73f-7ef3-ed2ac70ff673.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/744c9fc1-3d94-7101-4eff-3ac7abb9a0e7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/9aa4132e-f283-bcc5-ef72-7633d399c46a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/20d34670-b321-a9eb-bc7e-0305dc7cefce.png)

- ソース側のDMSエンドポイントを作成する
    - エンドポイントの作成を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/284e5c27-979e-60a3-b508-940d44739421.png)

    - エンドポイントを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/bb961335-e029-9cde-513c-329a69d3c937.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/63a47b4a-43d1-d535-8865-a8955d27361f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/722e7433-d194-13f0-10a4-fbbeb3a611ed.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/1e8599a6-6774-17f2-59f0-4f6e7d00aa91.png)

    - 接続テストの実施
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/9ab11daf-8b46-348c-78d4-ba77743a75fe.png)
「テストの実行」ボタンをクリックしてステータスがSuccessfulになったら接続成功。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/236a2218-19d0-01cf-fdff-6e0f88cbf17e.png)
「エンドポイントの作成」ボタンをクリックすればエンドポイント作成は完了。

- ターゲット側のDMSエンドポイントを作成する
    - エンドポイントの作成を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/1e2e8bd0-dbbe-b238-9b5a-df0fe479de52.png)

    - エンドポイントを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/a9532376-7e2b-a500-d07a-4b0f44b283c5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/df21539a-f874-e653-96fd-497deb869763.png)

    - 接続テストの実施
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/0193703b-ee7d-ca7d-f07a-9b66a01410c6.png)
「テストの実行」ボタンをクリックしてステータスがSuccessfulになったら接続成功。
「エンドポイントの作成」ボタンをクリックすればエンドポイント作成は完了。

- データベース移行タスクを作成する
    - データ移行タスクを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/e7bfc345-c3fc-d010-30bc-0a677c9274f6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/d82a7fc2-41a9-b6ef-fc8e-361aebdd7f3b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/709f98c5-17a9-181d-c92a-9f7cd7c53b89.png)
（あまり何も考えずにデフォルトのままにしている）

    - データ連携対象となるスキーマ名、テーブル名を指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/ebefc756-61e8-7ea3-8f16-ccb22572f521.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/16c1ee81-9854-9c3f-7f35-2a37e4427bf2.png)

    - 補足：対象となるテーブルおよびレコード格納状況
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/c1985e9c-de69-3073-b9d0-b0c05a6dfcc1.png)

    - タスクの実行（ここでは前述の移行タスクの設定によりタスク作成直後に自動実行される）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/50c150da-e7be-b3ed-a73a-94f49d4b1abe.png)
スターテス欄より、全量のロードが実行されて完了した後、継続的にレプリケーションが実行されていることがわかる。
- 断面データ（全量）の連携内容を確認する
    - ターゲットとなるS3の確認
        - S3にオブジェクトが配置されたことの確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/0d37ef77-7e71-403b-1649-275d84bca77c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/0d6b32c6-0466-4e86-ba10-70e39e0c56ff.png)

        - オブジェクトの中身の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/3a0495db-e1e7-c0c3-e34f-5b0aeefded3d.png)
データソースのテーブルにある全レコードがCSV形式で収録されていることを確認できた。
- 更新差分データの連携内容を確認する
    - INSERT
        - SQL実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/c8965964-096d-db77-f78b-6ce54a14c46f.png)

        - S3にオブジェクトが配置されたことの確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/dfbee552-1dca-ea33-0fe6-729875b695ef.png)
（ちなみに、INSERTしてから1分以上かかってS3にオブジェクトが配置された）

        - オブジェクトの中身の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/bb2d9fed-531b-4043-1ba7-a555f0f0fa56.png)
更新差分データの先頭には更新の種類を示す記号がセットされたレコードがS3オブジェクトに収録されている。（INSERTは「I」）

    - UPDATE
        - SQL実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/199b2f58-0aa9-16c5-b746-523885de125a.png)

        - S3にオブジェクトが配置されたことの確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/840d940e-8ccb-026d-29a5-c50847da6795.png)

        - オブジェクトの中身の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/05575f31-ac90-6180-c976-f5ca743f1257.png)
（UPDATEは「U」）

    - DELETE
        - SQL実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/f198706c-6d78-2f8f-d20a-04380c57e89b.png)

        - S3にオブジェクトが配置されたことの確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/0f007347-3801-4601-3ab2-c6b00d7abd37.png)

        - オブジェクトの中身の確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/64a983e0-9bf4-83f0-c7ac-f869c561d976.png)
（DELETEは「D」）

ゴールとして設定していたことが確認できました。

# 注意点
データソースの種類によって様々な制約があるようなので利用前に[こちらの公式情報](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Source.DB2.html)を確認しておく必要があります。
以下はその一例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/838636/424e2e55-cdd7-5db7-6e4b-be5bd56efaea.png)

# まとめ
DMSによってDb2にあるデータをS3に一括移行する方法と継続的レプリケーションをする方法を確認しました。
色々と制約はありそうですが、取っ掛かりとして参考になればと思います。