AWS DMSで移行失敗レコードを自動解消 〜 awsdms_validation_failures_v1活用システムの構築 〜

## はじめに

AWS DMSを使用したデータ移行時、失敗したレコードが`awsdms_validation_failures_v1`に記録される問題に直面することがあります。特に、継続的にデータベース間のデータ同期を行う場合、これらの問題を無視し続けることはできず、適切なデータの補正作業が必要となります。

本記事では、この課題を解決するために構築したシステムの概要を紹介します。データ不整合の修正と再同期のプロセスを詳しく解説し、同じ問題を抱えるエンジニアの方々に役立つ情報を提供します。

## 問題の背景
### `awsdms_validation_failures_v1`とは？
AWS DMSが移行に失敗したレコードを記録するシステムテーブルです。このテーブルには以下のような情報が格納されます：
- `table_name`: 失敗が発生したテーブル名
- `column_name`: 問題の発生したカラム名
- `error_message`: 詳細なエラーメッセージ

  詳細はAWSドキュメントの「[制御テーブルタスク設定](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TaskSettings.ControlTable.html
)」「[トラブルシューティング](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Validating.html#CHAP_Validating.Troubleshooting
)」で確認できます

https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TaskSettings.ControlTable.html

https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Validating.html#CHAP_Validating.Troubleshooting

### 主な移行失敗の原因
1. LOB設定の問題
2. データ型の不一致
3. CDC中のエラー

  詳細はAWSドキュメントの「[AWS DMS のソースデータベースとターゲットデータベース間のデータ不一致の問題をトラブルシューティングするにはどうすればよいですか?](https://repost.aws/ja/knowledge-center/dms-source-target-data-mismatch
)」で確認できます

https://repost.aws/ja/knowledge-center/dms-source-target-data-mismatch

---

## 解決策の概要

### 解決方法

データの不整合を解決する方法として、テーブル全体をフルロードして再同期する方法があります。しかし、この方法は、テーブル全体のデータ量に対して修復が必要なレコードが少ない場合には、非効率でコストが高くなる可能性があります。

こうした非効率なケースに対応するために、個別レコードを対象とした修復システムを構築しました。このシステムを利用することで、不整合データの修復を自動化し、効率的かつ迅速にデータを同期できるようになります。


### システム構成
![スクリーンショット 2024-12-11 22.59.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668979/588b2018-a43d-0cf9-3051-fcec0fbe9219.png)

### システムの概要
1. 自動補正アプリケーションが`awsdms_validation_failures_v1`を定期的にチェック
2. `awsdms_validation_failures_v1`を解析し、検証エラーが発生したSourceTableとTargetTableの当該レコード解析する
3. TargetTableに対して、修正クエリーを発行する
4. `awsdms_validation_failures_v1`の処理結果をApp_logTableに書き込む
 
  修正方法の詳細はAWSドキュメントの「[トラブルシューティング](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Validating.html#CHAP_Validating.Troubleshooting
)」で確認できます

https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Validating.html#CHAP_Validating.Troubleshooting

---
## システム構築の詳細

### 使用技術
- Java :  自作するアプリケーションの開発言語
- Argo Workflows : アプリケーションを定期実行できる環境

### 自動補正アプリケーションの機能説明

このアプリケーションは、`awsdms_validation_failures_v1`テーブルを参照し、データ不整合が発生したレコードの原因や状況を確認します。その後、アプリケーションがこれらのレコードを解析し、ソーステーブル（SourceTable）とターゲットテーブル（TargetTable）の内容を比較して、適切にターゲットテーブルのレコードを修復します。

修復が完了すると、DMSの検証処理によって再度レコードが確認され、問題が解消されたことを確認できます。

#### **重要なポイント**
- データ補正後も`awsdms_validation_failures_v1`のレコードは削除されないため、アプリケーションが同じレコードを再処理しないようにする必要があります。
- 修復済みのレコードを記録する「ログテーブル」を設けることで、同じレコードを繰り返し修正することを防止します。


 DMS検証の詳細はAWSドキュメントの「[AWS DMS データ検証](https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Validating.html
)」で確認できます

https://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Validating.html

### 所感

AWS DMSには、データの検証機能と、その結果を`awsdms_validation_failures_v1`に記録する機能が提供されています。しかし、不正データを再同期するための機能は用意されていないため、独自のアプリケーションを作成し、補正処理を実装する必要があります。

補正処理の実装形式は複数考えられますが、今回の実装では処理がある程度複雑になることを見越して、AWS Lambdaのような簡易的な環境は利用せず、複雑な処理に対応可能な開発環境と言語を選択しました。

また、補正処理が単一テーブルに対する処理であったため、アルゴリズムを確定させた後は、SourceTableとTargetTableのDDLをもとに、アプリケーションのソースコードを自動生成する仕組みも構築することができました。

### 追記 2025/05/26 
AWSからresync機能が提供され、一部DBではAWSサービスのみで検証と補正が完結するようになる

https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Validating.DataResync.html

https://aws.amazon.com/jp/about-aws/whats-new/2025/05/aws-dms-data-resync-improved-migration-accuracy/


---