目次
AWS Entity Resolution v2.0 完全ガイド(Data & Integration)
概要
AWS Entity Resolution は、複数のデータソース間でレコード間の同一性を判定し、マッチング・重複排除・統合 ID(match ID)の付与を自動化する、AWS の完全マネージドデータクリーニング・マスターデータ管理サービスです。顧客名寄せ(Customer Identity Resolution)・不正検知・データ品質向上を Rule-based / ML-based / Provider-based(LiveRamp / TransUnion)の複数マッチング戦略で実現します。
課題解決
- 複数システム間の顧客 ID 統合困難 - CRM・ECサイト・コールセンター・オフラインPOSに分散した同一顧客を、表記ゆれ(漢字/カタカナ/ローマ字)をまたいで一意に識別し、360度顧客ビューを構築
- マスターデータ品質低下 - 重複顧客レコード、不正確な住所・電話番号の混在により BI 分析精度が低下
- 外部データとのマッチング困難 - サードパーティ ID グラフ(LiveRamp / TransUnion)との統合で、プライバシー保護下でのデータ拡張が複雑
- GDPR / PII 管理コスト - 複数 DB に分散した顧客レコードの GDPR 削除・訂正が困難
アーキテクチャ概要
顧客データソース層:
├─ CRM DB (Salesforce, SAP)
│ └─ 顧客ID: C001, 名前: 田中太郎, メール: tanaka@example.com
├─ EC サイト DB (Magento, Shopify)
│ └─ 顧客ID: 12345, 名前: タナカタロウ, 電話: 090-1234-5678
└─ コールセンター DB (Zendesk)
└─ 顧客ID: X789, 名前: Taro Tanaka, 電話: 090-1234-5678
↓ Schema Mapping(スキーマ標準化)
Entity Resolution マッチングエンジン:
├─ Rule-based Matching
│ ├─ 完全一致: メールアドレス完全一致 → 同一人物確定
│ ├─ 正規化一致: 電話番号の正規化後一致
│ └─ マルチキー: メール & 電話両方一致
│
├─ ML-based Matching
│ ├─ 確率的マッチング: 表記ゆれを学習・許容
│ ├─ 信頼スコア: 0.0~1.0 で一致確度を量化
│ └─ 段階的処理: High Confidence → Medium → Low
│
└─ Provider-based Matching
├─ LiveRamp ID(RampID)との統合
└─ TransUnion ID との統合
↓ ID Mapping & 統合
出力:
├─ Unified Customer Profile
│ └─ matchID: M-20260427-001
│ └─ sourceRecords: [C001, 12345, X789]
│ └─ confidence: 0.95
├─ Match Details
│ ├─ matching_key: EMAIL
│ ├─ rule_name: EmailExactMatch
│ └─ timestamp: 2026-04-27T10:30:00Z
└─ S3 Output (Parquet)
└─ s3://entity-resolution-output/matches/
コアコンポーネント
1. Schema Mapping(スキーママッピング)
データソースの異なるフィールド定義を共通スキーマに変換。以下の属性タイプをサポート:
| フィールド型 | 説明 | 用途 |
|---|---|---|
| EMAIL_ADDRESS | メールアドレス | 顧客特定・本人確認 |
| PHONE_NUMBER | 電話番号(正規化対応) | 顧客特定・重複排除 |
| NAME | 人名(姓名分割対応) | 確率的マッチング |
| ADDRESS | 住所(番地まで) | 高精度マッチング |
| DATE_OF_BIRTH | 生年月日 | 本人確認・医療用途 |
| UNIQUE_ID | 元のレコード ID | 結果への逆引き |
| DOCUMENT_ID | 身分証 ID | 金融・医療分野 |
# Schema Mapping 作成例
aws entityresolution create-schema-mapping \
--schema-name customer-unified-schema \
--schema-arn arn:aws:entityresolution:ap-northeast-1:123456789012:schema-mapping/customer-unified-schema \
--mapped-input-fields '[
{
"fieldName": "email",
"type": "EMAIL_ADDRESS",
"matchKey": "EMAIL"
},
{
"fieldName": "phone",
"type": "PHONE_NUMBER",
"matchKey": "PHONE"
},
{
"fieldName": "first_name",
"type": "NAME",
"subType": "FIRST_NAME",
"matchKey": "FIRST_NAME"
},
{
"fieldName": "last_name",
"type": "NAME",
"subType": "LAST_NAME",
"matchKey": "LAST_NAME"
},
{
"fieldName": "address_line_1",
"type": "ADDRESS",
"subType": "ADDRESS_LINE_1",
"matchKey": "ADDRESS"
},
{
"fieldName": "postal_code",
"type": "ADDRESS",
"subType": "POSTAL_CODE"
},
{
"fieldName": "customer_id",
"type": "UNIQUE_ID"
}
]' \
--description "統合顧客スキーマ - CRM/EC/コールセンター"
2. Matching Workflow(マッチングワークフロー)
2.1 Rule-based Matching
確定的ルールに基づくマッチング。精度が高いが表記ゆれには対応しない。
# Rule-based ワークフロー作成
aws entityresolution create-matching-workflow \
--workflow-name customer-rule-match \
--input-source-config '[
{
"inputSourceARN": "arn:aws:glue:ap-northeast-1:123456789012:table/marketing_db/crm_customers",
"schemaName": "customer-unified-schema",
"applyNormalization": true
},
{
"inputSourceARN": "arn:aws:glue:ap-northeast-1:123456789012:table/marketing_db/ecommerce_customers",
"schemaName": "customer-unified-schema",
"applyNormalization": true
},
{
"inputSourceARN": "arn:aws:glue:ap-northeast-1:123456789012:table/marketing_db/callcenter_customers",
"schemaName": "customer-unified-schema",
"applyNormalization": true
}
]' \
--output-source-config '[
{
"outputS3Path": "s3://entity-resolution-output/rule-matches/",
"output": [
{"name": "customer_id"},
{"name": "email"},
{"name": "phone"},
{"name": "first_name"},
{"name": "last_name"}
],
"applyNormalization": false
}
]' \
--resolution-techniques '{
"resolutionType": "RULE_MATCHING",
"ruleBasedProperties": {
"rules": [
{
"ruleName": "EmailPhoneMatch",
"matchingKeys": ["EMAIL", "PHONE"],
"recordMatchingModel": "ONE_TO_ONE"
},
{
"ruleName": "EmailOnlyMatch",
"matchingKeys": ["EMAIL"],
"recordMatchingModel": "ONE_TO_ONE"
},
{
"ruleName": "PhoneOnlyMatch",
"matchingKeys": ["PHONE"],
"recordMatchingModel": "ONE_TO_ONE"
},
{
"ruleName": "NameAddressMatch",
"matchingKeys": ["FIRST_NAME", "LAST_NAME", "ADDRESS"],
"recordMatchingModel": "MANY_TO_MANY"
}
],
"attributeMatchingModel": "MANY_TO_MANY",
"blockingKeys": [
{
"name": "PostalCode"
}
]
}
}' \
--role-arn arn:aws:iam::123456789012:role/EntityResolutionRole
2.2 ML-based Matching
機械学習による確率的マッチング。表記ゆれ・スペルミスに対応し、信頼スコアを返す。
# ML-based ワークフロー作成
aws entityresolution create-matching-workflow \
--workflow-name customer-ml-match \
--input-source-config '[
{
"inputSourceARN": "arn:aws:glue:ap-northeast-1:123456789012:table/marketing_db/crm_customers",
"schemaName": "customer-unified-schema"
},
{
"inputSourceARN": "arn:aws:glue:ap-northeast-1:123456789012:table/marketing_db/ecommerce_customers",
"schemaName": "customer-unified-schema"
}
]' \
--output-source-config '[
{
"outputS3Path": "s3://entity-resolution-output/ml-matches/",
"output": [
{"name": "customer_id"},
{"name": "email"},
{"name": "confidence"}
]
}
]' \
--resolution-techniques '{
"resolutionType": "ML_MATCHING",
"mlMatchingWorkflow": {
"arn": "arn:aws:sagemaker:ap-northeast-1:123456789012:model/entity-matching-model"
}
}' \
--role-arn arn:aws:iam::123456789012:role/EntityResolutionRole
2.3 Provider-based Matching
LiveRamp / TransUnion などのサードパーティ ID グラフと統合。プライバシー保護下で外部データを活用。
# Provider-based ワークフロー
aws entityresolution create-matching-workflow \
--workflow-name customer-liveramp-match \
--input-source-config '[
{
"inputSourceARN": "arn:aws:glue:ap-northeast-1:123456789012:table/marketing_db/crm_customers",
"schemaName": "customer-unified-schema"
}
]' \
--resolution-techniques '{
"resolutionType": "PROVIDER",
"providerProperties": {
"providerServiceArn": "arn:aws:entityresolution:ap-northeast-1:123456789012:id-namespace/liveramp-rampid",
"providerConfiguration": {
"marKetplaceConfiguration": {
"dataSet": "liveramp-rampid-us"
}
}
}
}' \
--role-arn arn:aws:iam::123456789012:role/EntityResolutionRole
3. ID Mapping & Namespace
マッチング結果の統合 ID(match ID)管理と、サードパーティプロバイダーの ID との紐付け。
# ID Namespace 作成(プロバイダー ID 管理)
aws entityresolution create-id-namespace \
--id-namespace-name liveramp-rampid \
--type PROVIDER \
--id-namespace-arn arn:aws:entityresolution:ap-northeast-1:123456789012:id-namespace/liveramp-rampid \
--provider-properties '{
"providerName": "LiveRamp",
"providerServiceName": "RampID",
"providerId": "liveramp"
}' \
--description "LiveRamp RampID との統合用 ID ネームスペース"
# 統合 ID でのマッピング照会
aws entityresolution describe-id-namespace \
--id-namespace-arn arn:aws:entityresolution:ap-northeast-1:123456789012:id-namespace/liveramp-rampid
ユースケース実装
UC1: 小売・EC 向け顧客 360 度統合
import boto3
import pandas as pd
from datetime import datetime
# Entity Resolution クライアント
er = boto3.client('entityresolution', region_name='ap-northeast-1')
s3 = boto3.client('s3')
glue = boto3.client('glue')
# ステップ1: Glue テーブルの準備
crm_df = pd.DataFrame({
'customer_id': ['C001', 'C002', 'C003'],
'email': ['tanaka@example.com', 'yamada@example.com', 'suzuki@example.com'],
'phone': ['09012345678', '09087654321', '09099999999'],
'first_name': ['太郎', '次郎', '三郎'],
'last_name': ['田中', '山田', '鈴木'],
'address': ['東京都渋谷区', '大阪府大阪市', '名古屋市中区']
})
ec_df = pd.DataFrame({
'customer_id': ['E001', 'E002', 'E003'],
'email': ['tanaka.taro@example.com', 'yamada.jiro@example.com', 'suzuki.saburo@example.com'],
'phone': ['090-1234-5678', '090-8765-4321', None],
'first_name': ['タナカ', 'ヤマダ', 'スズキ'],
'last_name': ['タロウ', 'ジロウ', 'サブロウ'],
'address': ['東京都渋谷区', '大阪府大阪市', None]
})
# Glue にデータを登録(既存テーブル前提)
# ステップ2: ワークフロー実行
response = er.start_matching_job(
workflowName='customer-rule-match'
)
job_id = response['jobId']
print(f"Matching Job Started: {job_id}")
# ステップ3: 結果取得
import time
time.sleep(60) # ジョブ完了待機
# マッチング結果を S3 から取得
obj = s3.get_object(
Bucket='entity-resolution-output',
Key=f'rule-matches/{job_id}/matches.parquet'
)
results = pd.read_parquet(obj['Body'])
print(results.head(10))
# matchID でグループ化し統合顧客プロファイル作成
unified = results.groupby('matchID').agg({
'email': 'first',
'phone': 'first',
'first_name': 'first',
'last_name': 'first',
'address': 'first',
'customer_id': lambda x: '|'.join(x)
}).reset_index()
unified.columns = ['unified_customer_id', 'email', 'phone', 'first_name', 'last_name', 'address', 'source_customer_ids']
print(unified)
# 統合顧客を DynamoDB に保存
dynamodb = boto3.resource('dynamodb')
customers_table = dynamodb.Table('unified-customers')
for _, row in unified.iterrows():
customers_table.put_item(Item={
'unified_customer_id': row['unified_customer_id'],
'email': row['email'],
'phone': row['phone'],
'first_name': row['first_name'],
'last_name': row['last_name'],
'address': row['address'],
'source_customer_ids': row['source_customer_ids'],
'created_at': datetime.utcnow().isoformat(),
'match_confidence': 'high' # Rule-based は確実
})
print(f"Saved {len(unified)} unified customers to DynamoDB")
UC2: 金融機関の不正検知用顧客統合
# 複数口座の同一人物検出(不正検知)
def detect_fraud_duplicate_accounts():
import boto3
er = boto3.client('entityresolution')
# 複数ローン申込を同一人物の不正検知で検出
response = er.start_matching_job(
workflowName='customer-fraud-detection'
)
# ジョブ結果から信頼スコアが高く、複数申込がある人物を抽出
# → 不正可能性の高い案件として SIU(Special Investigation Unit)に報告
print("不正検知: 複数申込を同一人物と判定し、コンプライアンス確認開始")
UC3: M&A 後の顧客マスターデータ統合
# 買収企業 DB と既存企業 DB の顧客統合
def post_ma_customer_consolidation():
"""
M&A 後、買収側と既存側の顧客 DB を統合
- 重複顧客を排除
- 統合顧客 ID を各システムに配布
- 顧客 360 ビューを営業に提供
"""
er = boto3.client('entityresolution')
# 買収企業(Acquired Co.)と既存企業(Incumbent Co.)の顧客を Schema Mapping
# ワークフロー実行
response = er.start_matching_job(
workflowName='postma-customer-merge'
)
# 結果から重複度の高い顧客ペアを検出 → 営業に通知
# 営業が確認して統合 ID を確定
# → SalesForce, SAP に同期
print("M&A 顧客統合完了: 営業向けに統合 ID を配布")
post_ma_customer_consolidation()
AppFlow / DataZone との統合
Entity Resolution で生成した統合 ID(match ID)を、AWS Glue DataZone や AppFlow で活用。
# Glue DataZone データカタログへの統合 ID の登録
aws datazone create-asset \
--domain-identifier d-example123 \
--asset-type CustomerMasterData \
--name unified-customer-360 \
--asset-properties '{
"unified_customer_id": "arn:aws:s3:::entity-resolution-output/unified-customers/",
"match_source": "EntityResolution",
"match_confidence": "high",
"last_updated": "2026-04-27T10:30:00Z"
}' \
--description "Entity Resolution で生成した統合顧客マスターデータ"
# AppFlow で統合 ID を外部 SaaS(Salesforce など)と同期
aws appflow create-flow \
--flow-name entity-resolution-to-salesforce \
--flow-definition '{
"description": "Entity Resolution の統合 ID を Salesforce に同期",
"sourceFlowConfig": {
"connectorType": "S3",
"sourceConnectorProperties": {
"s3": {
"bucketName": "entity-resolution-output",
"bucketPrefix": "unified-customers/"
}
}
},
"destinationFlowConfigList": [{
"connectorType": "Salesforce",
"destinationConnectorProperties": {
"salesforce": {
"object": "Account"
}
}
}]
}'
競合他社との比較
| 観点 | Entity Resolution | Senzing | Tamr | Reltio | Informatica MDM | Talend MDM |
|---|---|---|---|---|---|---|
| ホスティング | AWS マネージド | Self-hosted / Cloud | SaaS | SaaS | SaaS / On-prem | SaaS / On-prem |
| マッチングアルゴリズム | Rule / ML / Provider | AI ベース(ニューラルネット) | 自動機械学習 | ルールベース + AI | ルールベース + ML | ルールベース + ML |
| 表記ゆれ対応 | あり(ML モード) | 強い(言語処理) | 強い | 限定的 | 限定的 | 限定的 |
| プロバイダー統合 | LiveRamp / TransUnion | 独自 ID グラフ | 統合なし | 独自 ID | 統合なし | 統合なし |
| スケーラビリティ | 無制限(AWS インフラ) | 数 GB~数 TB | 大規模対応 | 大規模対応 | 大規模対応 | 大規模対応 |
| 学習曲線 | 低い | 高い | 中程度 | 中程度 | 高い | 高い |
| AWS 統合 | ネイティブ(Glue / S3) | ないか限定的 | ないか限定的 | API 統合 | API 統合 | API 統合 |
| 導入期間 | 数週間 | 数ヶ月 | 数ヶ月 | 数ヶ月 | 数ヶ月 | 数ヶ月 |
コスト詳細
課金モデル
1. マッチング処理(Record-based):
- 月 30,000 件まで: 無料(FREE TIER)
- 30,001~100,000,000 件: $0.00012/件
- 例: 1,000,000 件 = $120/月
2. ID Namespace(プロバイダー ID 連携):
- LiveRamp / TransUnion との連携時
- $0.00015/件
- 例: 500,000 件 = $75/月
3. Incremental Matching(差分マッチング):
- 新規レコードの追加マッチング
- 通常マッチング費用 × 0.5
- 例: 10,000 件追加 = $0.60/月
4. AWS Glue / S3 連携:
- Glue ジョブ: $0.44/DPU-時間
- S3 ストレージ: $0.023/GB/月
コスト最適化
# 費用効率的なマッチングパイプライン
import boto3
def optimize_entity_resolution_cost():
er = boto3.client('entityresolution')
# 1. 段階的マッチング: Rule-based で確定 → ML で疑わしいものだけ処理
# Rule-based コスト: 低(確定的ルール)
# ML-based コスト: 中(疑わしい件数のみ)
# 2. ブロッキングキーで前処理
# → 郵便番号別に前処理して全体比較を回避
# → ビッグ O を N^2 から N×M に削減(M = 郵便番号あたりの件数)
# 3. 定期バッチ vs リアルタイム
# - 月次バッチ: オフピーク時に実行(コスト最適化)
# - リアルタイム: Lambda + incremental matching(高コスト)
# 例: 月次バッチで 5M 件マッチング
estimated_cost = 5_000_000 * 0.00012 # $600/月
print(f"月次バッチコスト: ${estimated_cost}")
# Incremental matching で新規 10K 件/日
daily_incremental = 10_000 * 0.00012 * 0.5 # 差分割引
monthly_incremental = daily_incremental * 30
print(f"月次インクリメンタル: ${monthly_incremental}")
optimize_entity_resolution_cost()
ベストプラクティス
BP1: Schema Mapping 設計
- フィールド型の適切な選択 - EMAIL は完全一致性が高いため HIGH_PRIORITY
- 正規化設定の活用 - 電話番号・住所は normalize=true で前処理
- BlockingKey の効果的な設定 - 郵便番号・国別にブロックして計算量削減
BP2: ルール設計
- 優先度順での ルール定義 - 高信頼ルール(完全一致)→ 低信頼ルール(部分一致)
- MANY_TO_MANY vs ONE_TO_ONE - 注意深く選択(N:M は計算量増加)
- ルール検証 - テストデータで precision / recall を測定
BP3: 品質監視
# マッチング品質の監視
def monitor_match_quality(match_results_df):
# Confidence スコア分布
print(f"Mean Confidence: {match_results_df['confidence'].mean():.3f}")
print(f"Confidence > 0.9: {len(match_results_df[match_results_df['confidence'] > 0.9])} 件")
# False Positive を検出(手動サンプル確認)
sample = match_results_df.sample(min(100, len(match_results_df)))
print(f"手動確認対象: {len(sample)} 件")
# 重複マッチ検出
duplicates = match_results_df.groupby('sourceRecordId').size()
if (duplicates > 1).any():
print(f"警告: 1 つのレコードが複数 matchID に割り当てられている")
BP4: セキュリティ・プライバシー
- IAM ロール最小権限 -
entityresolution:MatchRecordsのみ付与 - KMS 暗号化 - S3 出力に KMS CMK で暗号化
- PII マスキング - 出力結果から氏名・電話・住所をマスク(downstream 用)
トラブルシューティング
| 症状 | 原因 | 対応 |
|---|---|---|
| マッチ率が低い(10%未満) | ルール条件が厳しすぎる / フィールド品質低い | MANY_TO_MANY ルール追加、ML matching 試用 |
| False Positive 多発(無関係者が マッチ) | ルール条件が甘い(名前だけなど) | EMAIL / PHONE の必須化、信頼スコア閾値引上げ |
| ジョブが完了しない | Glue テーブルスキーマが schema mapping と不一致 | テーブルスキーマを確認、fieldName を修正 |
| 出力ファイルが破損 | S3 権限不足 / ディスク満杯 | IAM ロール確認、S3 容量確認 |
| Provider Matching 失敗 | LiveRamp / TransUnion 契約の問題 | プロバイダー契約確認、providerArn 確認 |
採用判断チェックリスト
- [ ] 複数システムに顧客データが分散している?
- [ ] 表記ゆれ(漢字/カタカナ/ローマ字)の対応が必要?
- [ ] 顧客 360 度ビューの構築目標がある?
- [ ] 不正検知・マスターデータ品質向上が課題?
- [ ] LiveRamp / TransUnion などサードパーティデータ活用の可能性?
- [ ] GDPR などプライバシー規制への対応が必要?
まとめ
AWS Entity Resolution は、複数データソース間の顧客 ID 統合・重複排除・マスターデータ品質向上を実現するマネージドサービスです。Rule-based・ML-based・Provider-based の 3 つのマッチング戦略を組み合わせ、顧客 360 度ビュー・不正検知・M&A 統合に適用できます。Glue / AppFlow / DataZone との統合で、AWS データプラットフォーム内での一元的なマスターデータ管理を実現します。
最終更新:2026-04-27 バージョン:v2.0