AWS Database Migration Service (AWS DMS) タスクが正常に実行されたにもかかわらず、Amazon Simple Storage Service (Amazon S3) のソースエンドポイントからデータが移行されていません。この問題をトラブルシューティングしたいです。
解決策
AWS DMS タスクが成功してもデータが移行されない理由はいくつかあります。ユースケースに応じて、解決策を実施してください。
タスクステータスは Load complete, replication ongoing であるにもかかわらず、AWS DMS タスクがターゲットでデータをロードしていない
ソースエンドポイントに定義した S3 パスが正しいことを確認します。レプリケーションログで、AWS DMS が S3 パス内のデータファイルを見つけられないことを示すエントリを特定します。
レプリケーションログのエントリ例
[SOURCE_UNLOAD ]I: Unload finished for table 'dms_schema'.'dms_table' (Id = 1). 0 rows sent. (streamcomponent.c:3396)
[TARGET_LOAD ]I: Load finished for table 'dms_schema'.'dms_table' (Id = 1). 0 rows received. 0 rows skipped. Volume transferred 0. (streamcomponent.c:3667)
Amazon S3 は、全ロードフェーズに関するデータファイル (data.csv) と進行中の変更に関するデータファイル (change_data.csv) を次の形式で保存します。
- S3-bucket/dms-folder/sub-folder/dms_schema/dms_table/data.csv
- S3-bucket/dms-folder/sub-folder/dms-cdc-path/dms-cdc-sub-path/change_data.csv
データファイルを見つけるために、S3 ソースエンドポイントはバケットフォルダ、変更データキャプチャ (CDC) パス、テーブル構造フィールドを参照します。
上記のファイルパスの例では、dms-folder/sub-folder がバケットフォルダです。S3 ソースエンドポイントの作成時に入力する CDC パスは、dms-cdc-path/dms-cdc-sub-path です。
例に挙げたファイルパスを使用するテーブル構造の例
{
"TableCount": 1,
"Tables": [
{
"TableColumns": […],
"TableColumnsTotal": "1",
"TableName": "dms_table",
"TableOwner": "dms_schema",
"TablePath": "dms_schema/dms_table/"
}
]
}
重要: テーブル構造の TablePath には、バケットフォルダのパス dms-folder/sub-folder を含めないでください。
エンドポイント設定を指定する際には、バケットフォルダは省略可能です。バケットフォルダを指定する場合、CDC パスと TablePath は Amazon S3 の同じフォルダにある必要があります。バケットフォルダを指定しない場合、TablePath と CDC パスは S3 バケットの直下に置かれます。
S3 ソースエンドポイントのバケットフォルダは、バケット名とテーブル構造のスキーマ名の間の任意のフォルダディレクトリにすることができます。上記のテーブル構造の例では、フォルダディレクトリは dms-schema です。バケットにフォルダの階層がない場合は、フィールドを空白のままにしてください。
注: バケットフォルダと CDC パスは、個別のフォルダにすることも、dms-folder や dms-folder/subfolder などのサブフォルダを含めることもできます。
DMS タスク設定で S3 ソースエンドポイントを使用する場合、テーブルマッピングにスキーマとテーブルを含める必要があります。データをターゲットに正常に移行するには、スキーマとテーブルが必要です。詳細については、「Amazon S3 の外部テーブルを AWS DMS のソースとして定義する」を参照してください。
タスクのテーブル準備モードに [ターゲットのテーブルを削除] を使用する場合は、DMS は dms_schema.dms_table というターゲットテーブルを作成します。
ターゲットテーブルを作成するコマンドの例
CREATE TABLE 'dms_schema'.'dms_table' (...);
注: Amazon S3 のフォルダ名とオブジェクト名では、大文字と小文字が区別されます。S3 エンドポイントのフォルダ名とオブジェクト名を指定するときは、大文字と小文字を正しく使用してください。
タスクのステータスは Load complete, replication ongoing であるにもかかわらず、テーブルの統計情報セクションにテーブルが存在しない
[ターゲットのテーブルを削除] モードを使用する場合、AWS DMS はターゲットのエンドポイントにテーブルを作成しない場合があります。S3 パスが正しくないか、データ型がサポートされていないことが原因で、この問題が発生する場合があります。
ソースエンドポイントの S3 パスが正しいことを確認します。次に、S3 エンドポイントがそのデータ型をサポートしていることを確認します。
DMS タスクのテーブルマッピングで定義されたフィルターが原因で、テーブルが欠落していないかどうかを確認します。タスクテーブルのマッピングに必要なテーブルが、S3 ソースエンドポイントのテーブル構造で定義されていることを確認してください。
タスクのステータスは Running であり、DMS タスクによりターゲットエンドポイントにテーブルが作成されたにもかかわらず、データが読み込まれていない
AWS DMS が S3 パスからデータを取得できない場合は、レプリケーションログを参照してエラーを特定します。詳細なログを取得するには、SOURCE_CAPTURE のログレベルを Default から Detailed Debug に変更します。
ログの例
[SOURCE_CAPTURE ]E: No response body. Response code: 403 [1001730] (transfer_client.cpp:589)
[SOURCE_CAPTURE ]E: failed to download file </dms-folder/sub-folder/dms_schema/dms_table/data.csv> from bucket <dms-test> as </rdsdbdata/data/tasks/NKMBA237MEB4UFSRDF5ZAF3EZQ/bucketFolder/dms-folder/sub-folder/dms_schema/dms_table/data.csv>,
status = 4 (FAILED) [1001730] (transfer_client.cpp:592)
レプリケーションログに No response body というエラーが表示される
No response body エラーは、S3 ソースエンドポイントの の AWS Identity and Access Management (IAM) ロールに正しいアクセス許可が設定されていない場合に発生します。この問題を解決するには、エラーメッセージに記載されている S3 パスにデータファイルが存在することを確認してください。次に、IAM ユーザーが s3:GetObject に対するアクセス許可を持っていることを確認します。
注: ソースバケットでバージョニングを有効化した場合は、s3:GetObjectVersion アクセス許可も付与する必要があります。
関連情報
AWS DMS のソースとして Amazon S3 を使用する