AWS DMS のソースとしての MongoDB の使用 - AWS Database Migration Service

「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」

AWS DMS のソースとしての MongoDB の使用

AWS DMS は、データベースソースとして MongoDB バージョン 3.x および 4.0 をサポートしています。

を初めて使用する場合は、以下の MongoDB データベースの概念に注意してください。MongoDB

  • のレコードは、フィールドと値のペアで構成されるデータ構造であるMongoDBドキュメントです。フィールドの値には、他のドキュメント、配列、およびドキュメントの配列を含めることができます。ドキュメントは、リレーショナルデータベースのテーブルの行とほぼ同等です。

  • コレクションは、ドキュメントのグループであり、リレーショナルデータベーステーブルとほぼ同等です。MongoDB

  • 内部的には、MongoDB ドキュメントは、ドキュメント内の各フィールドのタイプを含む圧縮形式で、バイナリ JSON (BSON) ファイルとして保存されます。各ドキュメントには一意の ID があります。

AWS DMS は、MongoDB をソースとして使用する場合、2 つの移行モードをサポートします。エンドポイントを作成するときに、AWS マネジメントコンソールまたは追加の接続属性 を使用して、[メタデータモードnestingLevel] パラメータを使用して移行モードを指定します。MongoDB移行モードの選択は、以下に説明するように、ターゲットデータの結果の形式に影響します。

ドキュメントモード

ドキュメントモードでは、MongoDB ドキュメントは「現状のまま」移行されます。これは、その中のドキュメントデータが、ターゲットテーブルの _doc という名前の 1 つの列と見なされることを意味します。をソースエンドポイントとして使用する場合、ドキュメントモードがデフォルト設定です。MongoDB

たとえば、MongoDB と呼ばれる myCollection コレクションの次のドキュメントについて考えてみます。

> db.myCollection.find() { "_id" : ObjectId("5a94815f40bd44d1b02bdfe0"), "a" : 1, "b" : 2, "c" : 3 } { "_id" : ObjectId("5a94815f40bd44d1b02bdfe1"), "a" : 4, "b" : 5, "c" : 6 }

ドキュメントモードを使用してデータをリレーショナルデータベーステーブルに移行した後、データは以下のように構成されます。ドキュメントのデータフィールドは MongoDB 列に統合されています。 _doc

oid_id _doc
5a94815f40bd44d1b02bdfe0 { "a" : 1, "b" : 2, "c" : 3 }
5a94815f40bd44d1b02bdfe1 { "a" : 4, "b" : 5, "c" : 6 }

オプションで、追加の接続属性 extractDocIDtrue に設定して、プライマリキーとして動作する、"_id" という名前の 2 つ目の列を作成できます。CDC を使用する場合は、ターゲットとして Amazon を使用する場合を除き、このパラメータを trueDocumentDB に設定します。

ドキュメントモードでは、AWS DMS は、コレクションの作成と名前の変更を次のように管理します。

  • 新しいコレクションをソースデータベースに追加すると、AWS DMS はコレクションの新しいターゲットテーブルを作成し、すべてのドキュメントをレプリケートします。

  • ソースデータベースで既存のコレクションの名前を変更すると、AWS DMS はターゲットテーブルの名前を変更しません。

ターゲットエンドポイントが Amazon DocumentDB の場合、ドキュメントモードで移行を実行します。

テーブルモード

テーブルモードでは、AWS DMS は MongoDB ドキュメントのそれぞれの最上位フィールドをターゲットテーブルの列に変換します。フィールドがネストされている場合、AWS DMS はネストされた値を 1 つの列にフラット化します。次に AWS DMS は、キーフィールドとデータ型をターゲットテーブルの列セットに追加します。

各 MongoDB ドキュメントについては、AWS DMS はターゲットテーブルの列セットに各キーとタイプを追加します。たとえば、テーブルモードを使用すると、AWS DMS は前の例を次のテーブルに移行します。

oid_id a b c
5a94815f40bd44d1b02bdfe0 1 2 3
5a94815f40bd44d1b02bdfe1 4 5 6

入れ子の値は、ドット区切りのキー名を含む列にフラット化されます。列は、ピリオドで区切られたフラット化されたフィールド名の連結と呼ばれます。たとえば、AWS DMS は、{"a" : {"b" : {"c": 1}}} のようなネストされた値のフィールドを持つ JSON ドキュメントを a.b.c. という名前の列に移行します。

ターゲット列を作成するために、AWS DMS は指定された数の MongoDB ドキュメントをスキャンして、すべてのフィールドとそのタイプのセットを作成します。次に AWS DMS は、このセットを使用してターゲットテーブルの列を作成します。コンソールを使用して MongoDB ソースエンドポイントを作成または変更する場合は、スキャンするドキュメントの数を指定できます。デフォルト値は 1000 ドキュメントです。を使用する場合は、追加の接続属性 AWS CLI を使用できます。docsToInvestigate

テーブルモードでは、AWS DMS は、ドキュメントとコレクションを次のように管理します。

  • 既存のコレクションにドキュメント (行) を追加する場合は、ドキュメントがレプリケートされます。ターゲットに存在しないフィールドがある場合、それらのフィールドはレプリケーションされません。

  • ドキュメントを更新すると、更新されたドキュメントはレプリケートされます。ターゲットに存在しないフィールドがある場合、それらのフィールドはレプリケーションされません。

  • ドキュメントの削除は完全にサポートされています。

  • CDC タスクの実行中に新しいコレクションを追加しても、ターゲット上に新しいテーブルは作成されません。

  • コレクションの名前を変更することはできません。

のソースとして MongoDB を使用する場合に必要なアクセス許可AWS DMS

ソースを含む AWS DMS の移行の場合、ルート権限を持つユーザーアカウントを作成するか、移行するデータベースに対してのみアクセス許可を持つユーザーを作成することができます。MongoDB

次のコードは、ルートアカウントとなるユーザーを作成します。

use admin db.createUser( { user: "root", pwd: "password", roles: [ { role: "root", db: "admin" } ] } )

次のコードは、移行するデータベースに対して最小限の権限を持つユーザーを作成します。

use database_to_migrate db.createUser( { user: "dms-user", pwd: "password", roles: [ { role: "read", db: "local" }, "read"] })

CDC 用の MongoDB レプリカセットの設定

で継続的なレプリケーションまたは CDC を使用するには、MongoDB に AWS DMS オペレーションログ (oplog) へのアクセスが必要です。MongoDBレプリカセットが存在しない場合に oplog を作成するには、レプリカセットをデプロイする必要があります。詳細については、「 ドキュメントMongoDB」を参照してください。

ソースエンドポイントとして設定された MongoDB レプリカのプライマリまたはセカンダリノードを持つ CDC を使用することができます。

スタンドアロンインスタンスをレプリカセットに変換するには

  1. コマンドラインを使用して、mongo に接続します。

    mongo localhost
  2. mongod サービスを停止します。

    service mongod stop
  3. 次のコマンドを使用して、mongod を再起動します。

    mongod --replSet "rs0" --auth -port port_number
  4. 次のコマンドを使用して、レプリカセットへの接続をテストします。

    mongo -u root -p password --host rs0/localhost:port_number --authenticationDatabase "admin"

ドキュメントモードの移行を実行する予定がある場合は、_id as a separate column エンドポイントを作成するときに MongoDB オプションを選択します。このオプションを選択すると、プライマリキーとして機能する _id という名前の 2 番目の列が作成されます。この 2 番目の列は、AWS DMS がデータ操作言語 (DML) オペレーションをサポートするために必要です。

のソースとして MongoDB を使用する場合のセキュリティ要件AWS DMS

AWS DMS では、MongoDB の 2 つの認証方法がサポートされています。 2 つの認証方法はパスワードを暗号化するために使用されるため、authType パラメータが PASSWORD に設定されている場合のみ使用されます。

の認証方法は次のとおりです。MongoDB

  • MONGODB-CR – バックワード互換性

  • SCRAM-SHA-1 バージョン 3.x および 4.0 の使用時のデフォルト–MongoDB

認証方法が指定されていない場合、AWS DMS は MongoDB ソースのバージョンのデフォルトの方法を使用します。

Atlas への接続MongoDB

ソースとして MongoDB Atlas を使用している場合は、以下の手順を実行します。

Atlas への接続MongoDB

  1. 接続には MongoDB Atlas マスターノード DNS を使用します。これは、 Atlas クラスターページの [概要MongoDB] タブで見つけることができます。

  2. Secure Sockets Layer (SSL) を [Require] に設定します。

  3. [Authentication (認証)] メカニズムを [scram_sha_1] に設定します。

コレクションのセグメント化と並列の移行MongoDB

移行タスクのパフォーマンスを向上させるために、MongoDB ソースエンドポイントは、並列全ロード機能の範囲セグメンテーションオプションをサポートしています。つまり、テーブルマッピング JSON 設定の並列全ロードを使用して、スレッドを並列に使用してセグメント化されたコレクションを移行できます。詳細については、「テーブルおよびコレクション設定のルールとオペレーション」を参照してください。

次の例は、7 つの項目があり、プライマリキーとして MongoDB を持つ _id コレクションを示しています。


                    MongoDB 7 つのアイテムを持つ  コレクション。

コレクションを 3 つのセグメントに分割し、並行して移行するには、次の JSON の例に示すように、移行タスクにテーブルマッピングルールを追加します。

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "testdatabase", "table-name": "testtable" }, "rule-action": "include" }, { "rule-type": "table-settings", "rule-id": "2", "rule-name": "2", "object-locator": { "schema-name": "testdatabase", "table-name": "testtable" }, "parallel-load": { "type": "ranges", "columns": [ "_id", "num" ] "boundaries": [ [ "5f805c97873173399a278d79", // First segment will select documents with _id less-than-or-equal-to 5eae7331a282eff90bf8b060 and num less-than-or-equal-to 2 "2" ], [ "5f805cc5873173399a278d7c", // Second segment will select documents with _id > 5f805c97873173399a278d79 and _id less-than-or-equal-to 5f805cc5873173399a278d7c "5" // and num > 2 and num less-than-or-equal-to 5 ] // Third segment is implied and selects documents with _id > 5f805cc5873173399a278d7c ] } } ] }

このテーブルマッピング定義は、ソースコレクションを 3 つのセグメントに分割し、並列で移行します。以下に示しているのは、セグメント化の境界です。

Data with _id less-than-or-equal-to "5f805c97873173399a278d79" and num less-than-or-equal-to 2 (2 records) Data with _id > "5f805c97873173399a278d79" and num > 2 and _id less-than-or-equal-to "5f805cc5873173399a278d7c" and num less-than-or-equal-to 5 (3 records) Data with _id > "5f805cc5873173399a278d7c" and num > 5 (2 records)

移行タスクの完了後、次の例に示すように、並列でテーブルがロードされたことをタスクログから確認できます。ソーステーブルから各セグメントをアンロードするために使用される MongoDB find() 句を検証することもできます。

[TASK_MANAGER ] I: Start loading segment #1 of 3 of table 'testdatabase'.'testtable' (Id = 1) by subtask 1. Start load timestamp 0005B191D638FE86 (replicationtask_util.c:752) [SOURCE_UNLOAD ] I: Range Segmentation filter for Segment #0 is initialized. (mongodb_unload.c:157) [SOURCE_UNLOAD ] I: Range Segmentation filter for Segment #0 is: { "_id" : { "$lte" : { "$oid" : "5f805c97873173399a278d79" } }, "num" : { "$lte" : { "$numberInt" : "2" } } } (mongodb_unload.c:328) [SOURCE_UNLOAD ] I: Unload finished for segment #1 of segmented table 'testdatabase'.'testtable' (Id = 1). 2 rows sent. [TASK_MANAGER ] I: Start loading segment #1 of 3 of table 'testdatabase'.'testtable' (Id = 1) by subtask 1. Start load timestamp 0005B191D638FE86 (replicationtask_util.c:752) [SOURCE_UNLOAD ] I: Range Segmentation filter for Segment #0 is initialized. (mongodb_unload.c:157) [SOURCE_UNLOAD ] I: Range Segmentation filter for Segment #0 is: { "_id" : { "$lte" : { "$oid" : "5f805c97873173399a278d79" } }, "num" : { "$lte" : { "$numberInt" : "2" } } } (mongodb_unload.c:328) [SOURCE_UNLOAD ] I: Unload finished for segment #1 of segmented table 'testdatabase'.'testtable' (Id = 1). 2 rows sent. [TARGET_LOAD ] I: Load finished for segment #1 of segmented table 'testdatabase'.'testtable' (Id = 1). 1 rows received. 0 rows skipped. Volume transfered 480. [TASK_MANAGER ] I: Load finished for segment #1 of table 'testdatabase'.'testtable' (Id = 1) by subtask 1. 2 records transferred.

現在、AWS DMS ではパーティションキー列として次の MongoDB データ型がサポートされています。

  • Double

  • 文字列

  • ObjectId

  • 32 ビット整数

  • 64 ビット整数

のソースとして MongoDB を使用する場合の制限AWS DMS

のソースとして MongoDB を使用する場合の制限は次のとおりです。AWS DMS

  • _id オプションが別の列として設定されている場合、ID 文字列は 200 文字以下でなければなりません。

  • オブジェクト ID および配列タイプキーは、テーブルモードで oid および array というプレフィックスが付けられた列に変換されます。

    内部的には、これらの列はプレフィックスが付けられた名前で参照されます。これらの列を参照する変換ルールを AWS DMS で使用する場合は、プレフィックス列を指定する必要があります。たとえば、${oid__id} ではなく ${_id} を指定するか、${array__addresses} ではなく ${_addresses} を指定します。

  • コレクション名にドル記号 ($) を含めることはできません。

  • 前述のように、テーブルモードとドキュメントモードには制限があります。

のソースとして MongoDB を使用する場合の追加の接続属性AWS DMS

ソースエンドポイントを設定するときに、追加の接続属性を指定できます。MongoDB追加の接続属性は、キーと値のペアで指定します。接続属性の設定が複数ある場合は、空白を追加せずにそれぞれをセミコロンで区切ります (例: oneSetting;thenAnother)。

次の表に、MongoDB データベースを AWS DMS ソースとして使用するときに使用できる追加の接続属性を示します。

Attribute Nameは 有効な値 デフォルト値と説明

authType

"no"

"password"

"password""no" を指定した場合、ユーザー名とパスワードのパラメータは使用されず、空にすることができます。

authMechanism

"default"

"mongodb_cr"

"scram_sha_1"

"default""scram_sha_1" です。 が authType に設定されている場合、この設定は使用されません。"no"

nestingLevel

"none"

"one"

"none" – ドキュメントモードを使用するよう "none" を指定します。テーブルモードを使用するよう "one" を指定します。

extractDocID

"true"

"false"

"false"nestingLevel"none" に設定されている場合、この属性を使用します。

ターゲットエンドポイントが DocumentDB の場合は、extractDocID=true を設定します。

docsToInvestigate

0 より大きい正の整数。

1000nestingLevel"one" に設定されている場合、この属性を使用します。

authSource

有効な MongoDB データベース名。

"admin"authType"no" に設定されている場合、この属性は使用されません。

注記

ターゲットエンドポイントが DocumentDB の場合、ドキュメントモードで移行を実行し、追加の接続属性 extractDocID=true を設定します。 追加の接続属性 (extractDocID=true) を設定するには、ソースエンドポイントを変更し、[_id as sparent column] チェックボックスをオンにします。

MongoDB のソースデータ型

のソースとして MongoDB を使用するデータ移行では、ほとんどの AWS DMS データ型がサポートされます。MongoDB次の表に、MongoDB を使用する場合にサポートされる AWS DMS のソースデータ型と、AWS DMS のデータ型からのデフォルトマッピングを示します。のデータ型の詳細については、MongoDB ドキュメントの「BSON 型」を参照してください。MongoDB

ターゲットにマッピングされるデータ型を表示する方法については、使用しているターゲットエンドポイントのセクションを参照してください。

AWS DMS のデータ型の詳細については、「AWS Database Migration Service のデータ型」を参照してください。

MongoDB データ型

AWS DMS データ型

ブール値

Bool

バイナリ

BLOB

日付

日付

タイムスタンプ

日付

Int

INT4

Long

INT8

Double

REAL8

String (UTF-8)

CLOB

配列

CLOB

OID

文字列

REGEX

CLOB

CODE

CLOB