AWS Database Migration Service(DMS)チュートリアル
公式ユーザーガイドのAWS Database Migration Service の開始方法を参考に実施しました。
このチュートリアルでは、オンプレミスからではなく、RDS for MySQLから、RDS for PostgreSQLへのデータ移行を試します。
目次
VPC
バージニア北部で元々作っていたDemo用のVPCを使用しました。
セキュリティグループ
DMS用とソースデータベース、ターゲットデータベース、設定クライアント用に4つ作成しました。
- DBConfiguration
インバウンドはなしでデフォルトのままです。 -
DMS
インバウンドはなしでデフォルトのままです。 -
MySQL
3306ポートに、DBConfiguration、DMS、マイIPからのインバウンドを許可。 -
PostgreSQL
5432ポートに、DBConfiguration、DMS、マイIPからのインバウンドを許可。
RDSパラメータグループ
mysql8.0
checksumをなしにするということでしたので、checksumが含まれるパラメータの値をNONEか0にしました。
binlog_formatはROWにしました。
postgres12
session_replication_roleをreplicaにしました。
RDS for MySQL(ソースデータベース)の作成
手順どおり、パブリックサブネットグループでパブリックアクセスを有効にしたMySQLインスタンスを作成しました。
開発検証用を選択してデフォルトのままで、インスタンスクラスをt3.microにしました。
パラメータグループとセキュリティグループは事前に作成したものを設定しました。
初期データベースは一応作成しましたが、要らなかったかもしれません。
RDS for PostgreSQL(ターゲットデータベース)の作成
手順どおり、パブリックサブネットグループでパブリックアクセスを有効にしたPostgreSQLインスタンスを作成しました。
開発検証用を選択してデフォルトのままで、インスタンスクラスをt3.microにしました。
パラメータグループとセキュリティグループは事前に作成したものを設定しました。
初期データベースは一応作成しました。
初期データベース作成用EC2インスタンス
t3a.nanoでスポットインスタンスで作成しました。
起動後、セッションマネージャで接続しました。
事前作業用にGitとMySQLをインストールしてSQLを実行しました。
1 2 3 4 5 6 |
$ pwd $ sudo yum install git mysql $ git clone https://github.com/aws-samples/aws-database-migration-samples.git $ cd ~/aws-database-migration-samples/mysql/sampledb/v1 $ mysql -h dms-mysql.xxxxxxxx.us-west-1.rds.amazonaws.com u admin -pchangeit dms_sample < install-rds.sql |
事後のレプリケーション確認用にPSSQLをインストールしました。
1 2 3 4 |
$ sudo su cd /etc/yum.repos.d vim pgdg.repo |
pgdg.repo
1 2 3 4 5 6 7 |
[pgdg11] name=PostgreSQL 11 $releasever - $basearch baseurl=https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7.5-x86_64 enabled=1 gpgcheck=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG-11 |
1 2 3 4 |
sed -i "s/rhel-\$releasever-\$basearch/rhel-7.5-x86_64/g" "/etc/yum.repos.d/pgdg.repo" yum groupinstall "PostgreSQL Database Server 11 PGDG" exit |
MySQL JDBCドライバを用意する
https://dev.mysql.com/downloads/connector/j/でダウンロードしました。
Platform Independentを選択しました。
ログインはせずに「No thanks, just start my download.」を選択してZipをダウンロードして、任意のディレクトリに展開しました。
PostgreSQLドライバを用意する
https://jdbc.postgresql.org/download.htmlからCurrent Versionをダウンロードしました。
SCTを使用してスキーマを移行する
macOSにAWS Schema Conversion ToolをインストールでインストールしておいたSCTを使用しました。
OLTP
Source database: MySQL
Target database: RDS for PostgreSQL
[Connect to MySQL]を押下して、サーバー情報を設定しました。
Server name: RDS for MySQLのエンドポイント
Server port: 3306
User name: admin
Password: changeit
MySQL driver path: 事前にダウンロードして展開していたjarを選択しました。
[Test connection]が成功しました。
[OK]を押下して接続しました。
[Connect to Amazon RDS for PostgreSQL]を押下して、サーバー情報を設定しました。
Server name: RDS for PostgreSQLのエンドポイント
Server port: 5432
Database: dms_sample
User name: postgres
Password: changeit
PostgreSQL driver path: 事前にダウンロードして展開していたjarを選択しました。
[Test connection]が成功しました。
[OK]を押下して接続しました。
左のソースのMySQLデータベースを選択して、変換対象のテーブル、ビュー、ファンクションを選択して右クリック-[Convert schema]を選択しました。
右のペインに変換対象のスキーマが反映されるので、右クリック-[Apply to database]でデータベースに反映しました。
画面全体です。
作業用EC2からスキーマが作成されたことを確認しました。
1 2 3 4 5 6 7 8 9 10 11 12 |
psql \ --host=dms-postgresql.xxxxxxxx.us-east-1.rds.amazonaws.com \ --port=5432 \ --username=postgres \ --password \ --dbname=dms_sample dms_sample=> SELECT * from dms_sample.person; id | full_name | last_name | first_name ---------+--------------+-----------+------------ (0 rows) |
DMSインスタンスの作成
DMSインスタンスを作成します。
インスタンスクラスはdms.t3.microを選択しました。
他はデフォルトです。
検証なのでシングルAZにしました。
セキュリティグループは事前に作成しているものを選択しました。
今回は必要なさそうですが、パブリックアクセス可能にしておきました。
作成しました。
DMSソースエンドポイントの作成
ソースエンドポイントを選択して、今回はRDSなので[RDS DBインスタンスの作成]をチェックして、MySQLインスタンスを選択しました。
エンドポイントへのデータベースアクセスでは、手動設定にしました。
[テストの実行]ボタンを押下してみて、successfulになりました。
セキュリティグループの設定も大丈夫だったみたいです。
[エンドポイントの作成]ボタンを押下しました。
DMSターゲットエンドポイントの作成
次はターゲットエンドポイントを作成しました。
同じように設定しました。
テストもOKでした。
作成しました。
ソースとターゲットが作成できました。
データベース移行タスクの作成
タスクの設定では、レプリケーションインスタンス、ソースデータベース、ターゲットデータベースを選択しました。
移行タイプは「既存のデータを移行して、継続的な変更をレプリケートする」を選択しました。
ターゲットテーブル作成モードで、「何もしない」に変更しました。
他はデフォルトでした。
[新しい選択ルールの追加]で[スキーマの入力]を選択して、[スキーマ名]にdms_sampleを入力しました。
他はデフォルトで作成しました。
移行の確認
移行タスクを作成すると移行が開始されました。
移行が完了しました。
テーブル統計で確認しました。
きれいに移行されたように見えます。
作業用EC2インスタンスで確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
psql \ --host=dms-postgresql.xxxxxxxx.us-east-1.rds.amazonaws.com \ --port=5432 \ --username=postgres \ --password \ --dbname=dms_sample dms_sample=> SELECT * from dms_sample.person limit 1; id | full_name | last_name | first_name ---------+--------------+-----------+------------ 6326532 | Rodney Blair | Blair | Rodney (1 row) dms_sample=> select * from dms_sample.person where first_name = 'Test'; id | full_name | last_name | first_name ----+-----------+-----------+------------ (0 rows) |
first_nameがTestのレコードはないことを確認しました。
チュートリアルの手順どおりにMySQLにレコードを追加して確認します。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ mysql -h dms-mysql.c3gngubysyz7.us-east-1.rds.amazonaws.com -u admin -p Enter password: ~中略~ MySQL [(none)]> use dms_sample ~中略~ Database changed MySQL [dms_sample]> insert person (full_name, last_name, first_name) VALUES ('Test User1', 'User1', 'Test'); Query OK, 1 row affected (0.01 sec) |
MySQLテーブルに接続してレコードを挿入しました。
マネジメントコンソールのテーブル統計で見てみると、レコードが挿入対象になっていることがわかりました。
1 2 3 4 5 6 |
dms_sample=> select * from dms_sample.person where first_name = 'Test'; id | full_name | last_name | first_name ---------+------------+-----------+------------ 7077781 | Test User1 | User1 | Test (1 row) |
PostgreSQLを確認すると追加したレコードが挿入されていました。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
SendGridのイベントをAPI Gateway -> Lambda(Python) -> DynamoDBに格納する
SendGridのメールイベントログはコンソールで確認出来るのは直近7日分で一括 …
-
Cloud9でAWS CDK環境
最初ローカルに作ろうと思ったのですが、環境依存がというか、Macbookの環境で …
-
API GatewayのアクセスログをCloudWatchに記録する
Amazon API GatewayのアクセスログをCloudWatchに記録で …
-
EC2:RunInstances APIにリクエストしてEC2インスタンスを起動(署名バージョン4、Postman)
AWSのAPIリクエストってHTTPでもよかったですよね?って思って、確認のため …
-
API GatewayからLambdaを介さずにSNSトピックへ送信
やりたいこと APIリクエストをまずLambdaで受けて、SNSトピックへ送信す …
-
AWS Elastic Beanstalkによって作成されたS3バケットはDeleteBucketが拒否されていた
ちょっとした検証をしたあとに、Elastic Beanstalkのアプリケーショ …
-
AtomエディタでEC2のファイルを直接編集する
Webページを編集していてEC2のファイルをvimエディタでさわったりしています …
-
EC2ユーザーデータからメタデータを取得してRocket.Chatで80ポートを使用する
Rocket.Chatのデフォルトポート番号は3000です。 80を使うようにす …
-
Amazon Glacierでボールトロックポリシーの作成開始をしてみました
Glacierを単体で使用することもそうそうないので、確認しました。 まずボール …
-
AWS DataLake 構築ハンズオンに行ってきました
AWSJ大阪が増床されて2019年10月限定でAWS pop-up loftとい …