目次

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