[DMS] MongoDBのデータをDynamoDBにレプリケーションする

eyecatch_dms

こんにちは、菊池です。

DMSでは、レプリケーションソースにMongoDBをサポートしています。これまでに、MongoDBからMySQL、S3へのレプリケーションを紹介しました。

今回は、同じNOSQL DBである、DynamoDBへのレプリケーションを試してみました。

検証

SourceとしてEC2で動作するMongoDBのレプリカセット、TargetとしてDynamoDBを利用します。

  • Source
    • MongoDB 3.4.6
    • レプリケーションモード:テーブルモード
  • Target
    • DynamoDB

mongo-to-dynamo-001

レプリケーション対象コレクション

ソースとなるMongoDBには以下のようcontactsコレクションにドキュメントを格納しておきます。

s0:PRIMARY> db.contacts.find()
{ "_id" : ObjectId("5977d2ce23ebab08bb17ed6a"), "name" : "hoge1", "city" : "Tokyo", "phone" : "090-xxxx-xxxx" }
{ "_id" : ObjectId("5977d2d523ebab08bb17ed6b"), "name" : "hoge2", "city" : "Kanagawa", "email" : "hoge2@example1.com" }
{ "_id" : ObjectId("5977d2dc23ebab08bb17ed6c"), "name" : "hoge3", "city" : "Chiba" }

DynamoDBターゲットの作成

エンドポイントとして、DynamoDBのターゲットを追加します。

mongo-to-dynamo-002

DynamoDBを選択すれば、必要なのはエンドポイント名とIAMロールの指定だけです。IAMロールはあらかじめ作成しておきましょう。IAMロールにはDMSが権限を引き受けられるよう、ロールポリシーを設定します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "dms.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

タスクの作成と実行

続いてタスクの作成と実行です。なお、MongoDBソースのエンドポイント作成については割愛しますので、必要に応じて過去のエントリを参照ください。

ソース/ターゲットのエンドポイントを指定し、テーブルマッピングを設定します。今回は特にマッピングの指定はしませんが、対象のテーブル(MongoDBではコレクション)を指定します。ちょっと日本語が微妙ですが、テーブル名を入れてルールを追加します。

mongo-to-dynamo-003

追加されました。

mongo-to-dynamo-004

テーブルマッピングは、JSONで指定することも可能です。

mongo-to-dynamo-005

今回の場合は以下のようになります。

{
  "rules": [
    {
      "rule-type": "selection",
      "rule-id": "1",
      "rule-name": "1",
      "object-locator": {
        "schema-name": "%",
        "table-name": "contacts"
      },
      "rule-action": "include"
    }
  ]
}

タスクが作成されましたので、そのまま実行し完了を待ちます。

mongo-to-dynamo-006

ロードが完了しました。

出力テーブルの確認

それでは出力を確認します。

DynamoDBのコンソールを確認すると、テーブルが作成されています。

mongo-to-dynamo-007

キャパシティは、Read/Writeとも200が設定されています。パーテーションキーは、old__idと設定されています。

テーブルの中のデータをみてみます。

mongo-to-dynamo-008

元のMongoDBのドキュメントがしっかりとレプリケーションされています。パーテーションキーのold__idの中は、元のコレクションの_idの値と一致しています。

まとめ

以上です。

これまでにRDBであるMySQL、ファイルストレージのS3、そして今回、NOSQLのDynamoDBへのレプリケーションを試してきました。MongoDBのようなNOSQL DBは、特定の用途に特化した一方で苦手なユースケースも多いです。DMSを使ってデータを連携することで、適切なデータストアを選択・利用することができます。

参考リンク