1. Vol3概要 — Glue Data Quality本番実装に特化

- AWS Glue Data Qualityは、DQDLルールセット定義→品質スコア算出→EventBridge/CloudWatchによるモニタリングのパイプラインを提供する。本Vol3はVol1 §6-1で解説した基礎の上に、本番環境での完全実装手順を積み重ねる。
- DQDLは完全性・一意性・整合性・参照整合性・カスタム条件など多様なルールタイプを持ち、推奨ルール自動生成機能で統計的な初期セットを生成できる。ルールチューニングは実データ統計との照合が品質の要点。
- 品質評価モードはETL組込みモード(GlueETLジョブ内の変換ステップ)とData Catalog評価モード(テーブルメタデータへの直接評価)の2種類あり、本番ユースケースに応じた選択が重要。
- DQDL全ルールタイプの正式名称・構文リファレンスと本番ルールセット設計テンプレート
- 推奨ルール自動生成の操作手順とチューニングパターン(閾値最適化・ルール優先度付け)
- ETL組込みモードとData Catalog評価モードの選択基準・本番実装コード例
- 品質スコアのEventBridge/CloudWatch連携によるSLAモニタリング設定(異常検知・SNSアラート含む)
1-1. シリーズにおけるVol3の位置づけ
AWSデータガバナンス本番運用シリーズは、エンタープライズデータ基盤に必要なガバナンスの全レイヤを3巻で体系化している。Vol1(DataZone/Lake Formation/Clean Rooms)はデータカタログの統制・組織横断のデータ共有・アクセス境界の設計を担う。Vol2(LF-Tag/セルレベルセキュリティ/データメッシュ/Macie)は属性ベースの細粒度アクセス制御と機密データの自動検出を担う。本Vol3(Glue Data Quality)は品質保証レイヤとして第3の柱を形成し、「誰が何にアクセスできるか」に加えて「そのデータが信頼できる品質か」を自動的に保証する仕組みを提供する。
3巻が揃うことで、AWSデータ基盤はカタログ統制・アクセス制御・品質保証の三位一体となり、コンプライアンス要件を満たす本番データガバナンス体制が完成する。Vol1 §6-1でGlue Data QualityのDQDL基礎(ルールセット概念・DQDLとは何か)を解説済みであるため、本Vol3ではその基礎の再説明を行わず、本番環境での実装手順・チューニング・運用監視に即座に入る。
→ Vol1 (基礎編): AWSデータガバナンス本番運用 Vol1|DataZone×Lake Formation×Clean Rooms
→ Vol2 (アクセス制御編): AWSデータガバナンス本番運用 Vol2|LF-Tag/セルレベル/データメッシュ/Macie
1-2. 読者像と前提知識
本Vol3の想定読者はGlue ETLジョブの開発・運用経験を持つデータエンジニアと、GlueデータカタログのテーブルメタデータやETLパイプラインを管理するデータカタログ管理者である。AWSサービスとしてはGlue、S3、CloudWatch、EventBridgeの基本的な操作経験を前提とする。
Vol1/Vol2を既読であり、Lake Formation権限モデル・LF-Tagアクセス制御の概念を理解していることを前提とする。DQDLとルールセットの基礎概念はVol1 §6-1で解説済みのため、本Vol3では概念説明を最小限とし、即座に実装コードと設定値の解説に移る。
本Vol3を通じて習得するスキルは、データエンジニアが日常業務でGlue Data Qualityを本番運用できるレベルを目標とする。具体的には、DQDLルールセットの設計・推奨ルール自動生成の活用・品質スコアのCloudWatch連携・SLA違反時のアラート設定・品質トレンドの可視化まで一気通貫で実装できることを目指す。初めてGlue Data Qualityに触れる場合は、Vol1 §6-1を先に参照することを推奨する。
本Vol3で使用するサービスは、AWS Glue(Data QualityとETL)・Amazon S3・Amazon CloudWatch・Amazon EventBridge・Amazon SNS・Amazon Athenaである。いずれもap-northeast-1(東京リージョン)での動作を前提とするが、Data Quality機能は全商用リージョンで利用可能である(2024年時点)。
1-3. 本番実装特化の宣言
本Vol3はVol1 §6-1で解説したDQ基礎の上に、Glue Data Quality本番実装に特化した実践ガイドである。「概念説明は最小限・コード例と設定値を主体とする」を本Vol3の基本方針とし、読んだその日から本番環境に適用できる具体的な実装手順を提供する。Vol1/Vol2既読を前提とし、基礎知識の再説明は行わない。
品質スコアは0.0〜1.0のdecimal値として算出される(パーセント値ではない)。本番SLA設計では「スコア0.95未満でアラート」「スコア0.80未満でパイプライン停止」のように複数閾値を段階設定することを推奨する。
本Vol3を完読することで得られる実装成果物は以下の5項目である。第1に、DQDL全ルールタイプの正式名称・構文・適用例を網羅したルールセット設計テンプレート。第2に、StartDataQualityRuleRecommendationRun + GetDataQualityRuleRecommendationRun APIペアを使った推奨ルール自動生成と閾値チューニングの手順(推奨ルール実行結果は90日後に自動削除される点に注意)。第3に、ETL組込みモードとData Catalog評価モードの選択基準と各モードのPythonコード実装例(AnalyzersとDynamicRulesはETLモードのみ対応)。第4に、EventBridgeイベントとglue.data.quality.rules.passed / glue.data.quality.rules.failedのCloudWatchメトリクス・SNSアラートを組み合わせた品質SLAモニタリング設定(メトリクス送出にはコンソール「Publish metrics to CloudWatch」オプションの有効化が必須)。第5に、品質スコア(0.0〜1.0のdecimal値)をS3蓄積・Athenaクエリ・QuickSight可視化するトレンドダッシュボードの構築手順。
本記事の構成: §2で環境準備と権限設計を行い、§3でDQDL全ルールタイプを網羅する。§4で推奨ルール自動生成・チューニングを実践し、§5でETL組込みモードとData Catalog評価モードの両実装を示す。§6でEventBridge/CloudWatch連携モニタリングを構築し、§7で品質トレンド可視化とガバナンスサイクルを確立する。§8はコスト試算とシリーズ総括である。
Vol1: DataZone×Lake Formationの基礎はこちら
2. 前提環境と準備

2-1. 必要なAWSサービス・権限
Glue Data Quality本番運用に必要なIAM権限を以下の表に示す。ETL組込みモード(GlueジョブロールにアタッチするポリシーA)とData Catalog評価モード専用ロール(スケジュール実行用ポリシーB)で最小権限を分離することを推奨する。
ポリシーA: GlueJobRole追加ポリシー(ETL組込みモード用)
| IAMアクション | 対象リソース | 用途 |
|---|---|---|
glue:StartDataQualityRulesetEvaluationRun | * | ルールセット評価ジョブの開始 |
glue:GetDataQualityResult | * | 品質評価結果の取得 |
glue:GetDataQualityRulesetEvaluationRun | * | 評価実行状態の確認 |
glue:ListDataQualityResults | * | 評価結果一覧の取得 |
glue:BatchGetDataQualityResult | * | 複数評価結果の一括取得 |
cloudwatch:PutMetricData | * | 品質スコアのCloudWatch送出 |
logs:CreateLogGroup | /aws-glue/* | Glueログ出力先の作成 |
logs:CreateLogStream | /aws-glue/* | Glueログストリーム |
logs:PutLogEvents | /aws-glue/* | Glueログの書込み |
s3:PutObject | arn:aws:s3:::YOUR-BUCKET/dq-results/* | 評価結果のS3出力 |
s3:GetObject | arn:aws:s3:::YOUR-BUCKET/* | テストデータ読込み |
ポリシーB: DataQualityCatalogRole(Data Catalog評価モード専用)
| IAMアクション | 対象リソース | 用途 |
|---|---|---|
glue:StartDataQualityRulesetEvaluationRun | * | カタログ評価ジョブの開始 |
glue:StartDataQualityRuleRecommendationRun | * | 推奨ルール自動生成ジョブの開始 |
glue:GetDataQualityRuleRecommendationRun | * | 推奨ルール生成結果の取得 |
glue:GetTable | arn:aws:glue:*:*:table/*/* | カタログテーブルのメタデータ取得 |
glue:GetDatabase | arn:aws:glue:*:*:database/* | データベースメタデータ取得 |
events:PutRule | * | EventBridgeルール設定 |
events:PutTargets | * | EventBridgeターゲット設定 |
sns:Publish | arn:aws:sns:ap-northeast-1:ACCOUNT:your-dq-topic | 品質SLAアラート通知 |
s3:PutObject | arn:aws:s3:::YOUR-BUCKET/dq-results/* | 評価結果のS3出力 |
AWS CLIバージョン要件
AWS CLI 2.x(2.13.0以降を推奨)が必要である。Data Quality関連のサブコマンド(start-data-quality-ruleset-evaluation-run等)はCLI 2.xで正式サポートされている。CLI 1.x環境ではコマンドが存在しない場合があるため、aws --versionで確認のうえアップグレードすること。
# バージョン確認
aws --version
# aws-cli/2.x.x Python/3.x.x Darwin/... 以上であること
# IAM権限の事前確認 (dry-run相当)
aws glue list-data-quality-rulesets --region ap-northeast-1 --max-results 1
2-2. Glue Data Qualityの有効化
AWSコンソールでの有効化手順
- AWS Management Console → Glue サービスを開く
- 左側ナビゲーションの「Data Quality」セクションを選択する
- 初回アクセス時はサービス利用確認画面が表示されるので「Enable Data Quality」をクリックする
- 有効化後、「Rulesets」「Runs」「Results」の各タブが利用可能になる
- 「Rulesets」→「Create ruleset」でルールセット作成画面に遷移できることを確認する
CLIでのGlue Data Quality有効化確認
コンソールでの有効化後、以下のCLIコマンドで正常に利用可能かを確認する。
# Data Qualityが有効かどうか確認(エラーなしで空リストが返れば有効)
aws glue list-data-quality-rulesets \
--region ap-northeast-1 \
--max-results 5
# 既存Glueカタログのデータベース一覧確認
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
aws glue get-databases \
--catalog-id "${ACCOUNT_ID}" \
--region ap-northeast-1 \
--query 'DatabaseList[*].Name' \
--output table
# 対象データベースのテーブル一覧と格納場所確認
aws glue get-tables \
--database-name YOUR_DATABASE \
--region ap-northeast-1 \
--query 'TableList[*].{Name:Name,Location:StorageDescriptor.Location,Columns:StorageDescriptor.Columns[*].Name}' \
--output json
既存ルールセットの一覧と詳細確認
# 既存ルールセット一覧(作成済みの場合)
aws glue list-data-quality-rulesets \
--region ap-northeast-1
# 特定ルールセットの詳細確認(DQDLルール内容の確認)
aws glue get-data-quality-ruleset \
--name YOUR_RULESET_NAME \
--region ap-northeast-1 \
--query '{Name:Name,Rules:Rules,TargetTable:TargetTable}'
Glue IAMロールへの権限アタッチ
既存のGlue実行ロール(GlueJobRole)に§2-1のポリシーAをアタッチする。インラインポリシーとして直接追加する場合は以下の手順を実行する。
# ポリシードキュメントをローカルに保存(glue-dq-policy.json)
cat > /tmp/glue-dq-policy.json << 'POLICY'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"glue:StartDataQualityRulesetEvaluationRun",
"glue:GetDataQualityResult",
"glue:GetDataQualityRulesetEvaluationRun",
"glue:ListDataQualityResults",
"glue:BatchGetDataQualityResult",
"cloudwatch:PutMetricData",
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": ["s3:PutObject", "s3:GetObject"],
"Resource": "arn:aws:s3:::YOUR-BUCKET/*"
}
]
}
POLICY
# インラインポリシーとしてアタッチ
aws iam put-role-policy \
--role-name GlueJobRole \
--policy-name GlueDataQualityPolicy \
--policy-document file:///tmp/glue-dq-policy.json
2-3. サンプルデータセットの準備
以降の §3〜§6 の実装手順を動作確認するため、品質問題(NULL・重複・異常値)を意図的に含むテストデータを準備する。NULL率15%・重複10件・範囲外値5件を含む25行のCSVを用いることで、DQDLルールが期待通りに機能するかを確認できる。
テストCSVの内容
order_id,customer_id,product_code,amount,order_date,status
1001,CUST001,PROD-A,15000,2024-01-05,completed
1002,CUST002,PROD-B,3200,2024-01-06,completed
1003,CUST003,PROD-A,87500,2024-01-07,completed
1004,CUST001,PROD-C,1200,2024-01-08,pending
1005,CUST004,,2800,2024-01-09,completed
1006,CUST005,PROD-B,4100,2024-01-10,completed
1007,CUST002,PROD-A,,2024-01-11,completed
1008,CUST006,PROD-D,9800,2024-01-12,shipped
1009,CUST007,PROD-B,2200,2024-01-13,completed
1010,CUST003,PROD-A,1500000,2024-01-14,completed
1001,CUST001,PROD-A,15000,2024-01-05,completed
1011,CUST008,PROD-C,,2024-01-15,pending
1012,,PROD-A,6700,2024-01-16,completed
1013,CUST009,PROD-B,4300,2024-01-17,completed
1014,CUST010,PROD-D,8900,2024-01-18,shipped
1002,CUST002,PROD-B,3200,2024-01-06,completed
1015,CUST011,PROD-A,11000,2024-01-19,completed
1016,CUST012,PROD-C,5600,2024-01-20,completed
1017,CUST013,,3700,2024-01-21,completed
1018,CUST014,PROD-B,-500,2024-01-22,completed
1019,CUST015,PROD-A,7800,2024-01-23,completed
1003,CUST003,PROD-A,87500,2024-01-07,completed
1020,CUST016,PROD-D,23000,2024-01-24,shipped
1021,CUST017,PROD-B,,2024-01-25,pending
1022,CUST018,PROD-A,9200,2024-01-26,invalid_status
このテストデータには以下の品質問題が意図的に含まれている。
| 問題の種類 | 件数 | 詳細 |
|---|---|---|
| NULLレコード | 4件 | product_code・amount・customer_id 欠損 |
| 重複レコード | 3組(6件) | order_id 1001・1002・1003が完全重複 |
| 範囲外値 | 2件 | amountが-500(負値)・1500000(上限超過) |
| 無効ステータス | 1件 | statusがinvalid_status(列挙値外) |
S3へのアップロード
# テストデータをローカルに保存
cat > /tmp/orders_test.csv << 'CSV'
order_id,customer_id,product_code,amount,order_date,status
1001,CUST001,PROD-A,15000,2024-01-05,completed
... (上記CSVの内容)
CSV
# S3バケットへアップロード
BUCKET_NAME="your-dq-test-bucket"
aws s3 cp /tmp/orders_test.csv s3://${BUCKET_NAME}/raw/orders/orders_test.csv \
--region ap-northeast-1
# アップロード確認
aws s3 ls s3://${BUCKET_NAME}/raw/orders/ --human-readable
Glueテーブルの作成
# Glueデータベース作成(既存の場合はスキップ)
aws glue create-database \
--database-input '{"Name":"dq_test_db","Description":"Data Quality テスト用データベース"}' \
--region ap-northeast-1
# Glueテーブル作成(テストCSVのスキーマ定義)
aws glue create-table \
--database-name dq_test_db \
--table-input '{
"Name": "orders_raw",
"Description": "DQテスト用受注データ",
"StorageDescriptor": {
"Columns": [
{"Name": "order_id", "Type": "int"},
{"Name": "customer_id", "Type": "string"},
{"Name": "product_code", "Type": "string"},
{"Name": "amount", "Type": "int"},
{"Name": "order_date", "Type": "string"},
{"Name": "status", "Type": "string"}
],
"Location": "s3://your-dq-test-bucket/raw/orders/",
"InputFormat": "org.apache.hadoop.mapred.TextInputFormat",
"OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
"SerdeInfo": {
"SerializationLibrary": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe",
"Parameters": {
"field.delim": ",",
"skip.header.line.count": "1"
}
}
},
"TableType": "EXTERNAL_TABLE",
"Parameters": {"classification": "csv"}
}' \
--region ap-northeast-1
# テーブル作成確認
aws glue get-table \
--database-name dq_test_db \
--name orders_raw \
--region ap-northeast-1 \
--query 'Table.{Name:Name,Location:StorageDescriptor.Location,Columns:StorageDescriptor.Columns[*].Name}'
テーブル作成が確認できたら、§3のDQDL全ルールタイプの実装に進む。このテストテーブルを評価対象として使用することで、各ルールタイプがどのようにNULL・重複・異常値を検出するかを実機確認できる。
3. DQDL完全ガイド — 全ルールタイプとルールセット設計

3-1. DQDLの構文と基本構造
DQDLのルールセットは Rules = [...] 形式で記述する。角括弧内に1つ以上のルールをカンマ区切りで並べることでルールセットを構成する。
基本構文
Rules = [
RuleType "column_name" 比較演算子 値,
RuleType "column_name" 比較演算子 値
]
コメント記法
行末コメントはサポートされていない。ルールセット内にコメントを記述したい場合は、別途ドキュメント管理で対応する(公式ドキュメント参照)。
文字列リテラルのクォート規則
カラム名や文字列値はダブルクォート(")で囲む。値リストは ["val1", "val2"] のように角括弧内にカンマ区切りで指定する。正規表現パターンも同様にダブルクォートで囲む。
制限事項
– 1つのルールセットに定義できるルール数の上限については公式ドキュメントを参照のこと。
– ルールは上から順に評価され、個別に PASS / FAIL 判定が下される。
– ルールセット全体のスコア(0.0〜1.0 の decimal 値)は PASS ルール数 / 全ルール数で算出される(×パーセント表記ではない)。
3-2. 全ルールタイプリファレンス
以下の表では、AWS Glue Data Quality が提供する全ルールタイプを網羅する。「ETL」列はGlue ETLジョブでの対応可否、「DC」列はData Catalog(データカタログ評価タスク)での対応可否を示す。
| ルールタイプ | 正式名称 | 用途 | 構文例 | ETL | DC |
|---|---|---|---|---|---|
| 行数検証 | RowCount | テーブルの総行数が期待範囲内か確認 | RowCount > 1000 | ✅ | ✅ |
| NULL率検証 | Completeness | 指定カラムのNULL以外の割合が閾値以上か確認 | Completeness "order_id" >= 0.99 | ✅ | ✅ |
| 重複検証 | Uniqueness | 指定カラムのユニーク値の割合が閾値以上か確認 | Uniqueness "customer_id" >= 0.95 | ✅ | ✅ |
| ユニーク値率 | Distinctness | カラム内のユニーク値率(NULL含む行数比)を検証 | Distinctness "product_code" > 0.8 | ✅ | ✅ |
| 値範囲・正規表現・リスト | ColumnValues | カラムの値が範囲・正規表現・許可リストに合致するか確認 | ColumnValues "status" in ["active", "inactive"] | ✅ | ✅ |
| タイムスタンプ鮮度 | DataFreshness | 指定カラムの最新タイムスタンプが一定期間内か確認 | DataFreshness "updated_at" <= 3 hours | ✅ | ✅ |
| 参照整合性 | ReferentialIntegrity | 指定カラムの値が参照先テーブルのカラムに存在するか確認 | ReferentialIntegrity "orders.customer_id" "customers.id" >= 1.0 | ✅ | ✅ |
| カラム数検証 | ColumnCount | テーブルのカラム数が期待値と一致するか確認 | ColumnCount = 15 | ✅ | ✅ |
| カラム存在確認 | ColumnExists | 指定カラムがテーブルに存在するか確認 | ColumnExists "event_date" | ✅ | ✅ |
| カスタムSQL | CustomSql | 任意のSQLクエリ結果が条件を満たすか確認 | CustomSql "SELECT count(*) FROM primary WHERE amount < 0" = 0 | ✅ | ✅ |
| NULLなし(ブール型) | IsComplete | カラムにNULLが1件も存在しないことを確認(ブール型ルール) | IsComplete "transaction_id" | ✅ | ✅ |
| 重複なし(ブール型) | IsUnique | カラムに重複値が1件も存在しないことを確認(ブール型ルール) | IsUnique "order_id" | ✅ | ✅ |
| 主キー制約(ブール型) | IsPrimaryKey | 指定カラム(複合可)がNULLなし・重複なしの主キー条件を満たすか確認 | IsPrimaryKey "id" | ✅ | ✅ |
| アナライザー(統計) | Analyzers | 平均・標準偏差・最小・最大などの統計値を取得してルール評価 | Mean "price" between 100 and 5000 | ✅ | ❌ |
| 動的ルール | DynamicRules | 過去の統計値(履歴)を参照して動的に閾値を決定するルール | RowCountMatch など | ✅ | ❌ |
⚠️ 精度の罠⑤:
Analyzers(Mean, StandardDeviation 等)およびDynamicRulesは ETLモードのみ対応。Data Catalogの評価タスク(DCモード)では使用不可。DCモードで記述してもエラーまたはスキップされる。
3-3. 本番ルールセット設計 — 段階的導入戦略
本番環境へのDQDL適用は段階的に行うことが推奨される。一度にすべてのルールを FAIL 閾値で設定すると、データパイプラインが過剰に停止するリスクがある。
フェーズ1: 基礎ルール(WARN運用で動作確認)
まず RowCount・Completeness・Uniqueness の3種を低閾値の WARN として設定し、実データの品質分布を把握する。
フェーズ2: 高度ルール追加(WARN → FAIL 昇格)
フェーズ1で収集した実績スコアを基に閾値を精緻化し、ReferentialIntegrity・DataFreshness・ColumnValues を追加する。基礎ルールの閾値も本番水準に引き上げて FAIL 化する。
フェーズ3: カスタムSQL・統計ルール(ETLモードのみ)
ビジネスロジック固有の検証は CustomSql で対応する。ETLジョブであれば Analyzers による統計値検証も追加できる。
WARN / FAIL 閾値の段階設定例
| ルール | WARN閾値 | FAIL閾値 | 備考 |
|---|---|---|---|
Completeness "order_id" | >= 0.90 | >= 0.95 | フェーズ1では WARN のみ設定 |
Completeness "customer_id" | >= 0.85 | >= 0.95 | 外部連携キーは厳格に管理 |
Uniqueness "transaction_id" | >= 0.99 | = 1.0 | 二重処理防止のため高閾値 |
RowCount | > 500 | > 100 | 最低行数を下回ったら即 FAIL |
DataFreshness "updated_at" | <= 6 hours | <= 24 hours | SLAに合わせて調整 |
本番ルールセットテンプレート
Rules = [
# ── フェーズ1: 基礎ルール ──
RowCount > 1000,
Completeness "order_id" >= 0.99,
Completeness "customer_id" >= 0.95,
Uniqueness "transaction_id" = 1.0,
IsComplete "order_id",
IsUnique "transaction_id",
IsPrimaryKey "order_id",
# ── フェーズ2: 高度ルール ──
ColumnValues "status" in ["pending", "confirmed", "shipped", "cancelled"],
ColumnValues "amount" >= 0,
DataFreshness "created_at" <= 24 hours,
ReferentialIntegrity "orders.customer_id" "customers.id" >= 0.99,
ColumnExists "order_id",
ColumnExists "created_at",
ColumnCount >= 10,
# ── フェーズ3: カスタム検証(ETLモード) ──
CustomSql "SELECT count(*) FROM primary WHERE amount < 0" = 0,
CustomSql "SELECT count(*) FROM primary WHERE order_id IS NULL AND status != 'draft'" = 0
]
このテンプレートをベースに、実際のスキーマ・ビジネスルールに合わせてカラム名と閾値を調整する。
AnalyzersやDynamicRulesを使う場合は ETLモード専用タスクとして別途ルールセットを定義すること(DC評価タスクへの混在は非対応・精度の罠⑤)。
4. 推奨ルール自動生成とルールチューニング
- 推奨ルール生成の正式APIペア:
StartDataQualityRuleRecommendationRun→GetDataQualityRuleRecommendationRun(「GetDataQualityRuleRecommendations」という名称のAPIは存在しない) - 推奨ルール実行結果は90日後に自動削除される。長期保存が必要な場合はS3エクスポートが必須。
- 生成された推奨ルールはそのまま本番適用せず、実データ統計+バッファ率(5〜10%)でチューニングすることが品質ゲートの信頼性を左右する。
4-1. 推奨ルール自動生成の仕組み
AWS Glue Data Qualityの推奨ルール自動生成機能は、AWSの機械学習モデルがデータプロファイリング結果を解析し、対象テーブルに統計的に適合したDQDLルールを自動で提案する機能である。手書きでルールセットをゼロから作成する手間を削減し、統計的な初期ルールセットを素早く得られることが最大の価値である。
AWSコンソールでの操作手順
- AWSマネジメントコンソール → AWS Glue → 左メニュー「Data Quality」を選択
- 対象データベース・テーブルを選択し、「Data quality rules」タブを開く
- 「Recommend rules」ボタンをクリック
- 実行に使用するIAMロールを指定し、「Start run」を実行
- ステータスが「SUCCEEDED」になったら「View recommended rules」で結果を確認
- 必要に応じてルールセットとして保存し、§4-3のチューニングを行う
コンソールの「Recommend rules」は内部的に StartDataQualityRuleRecommendationRun APIを呼び出し、非同期でプロファイリング→ルール推定を実行する。
CLI操作 — 推奨ルール生成の開始
# 推奨ルール生成ジョブを開始 (正式API: StartDataQualityRuleRecommendationRun)
aws glue start-data-quality-rule-recommendation-run \
--data-source '{"GlueTable": {"DatabaseName": "sales_db", "TableName": "orders"}}' \
--role "arn:aws:iam::123456789012:role/GlueDataQualityRole" \
--number-of-workers 5 \
--timeout 2880 \
--created-ruleset-name "orders_recommended_v1"
# レスポンス: {"RunId": "dqrun-xxxxxxxxxxxxxxxxxxxx"}
主要パラメータの説明:
| パラメータ | 必須 | 説明 |
|---|---|---|
DataSource.GlueTable | ○ | 評価対象のデータベース名とテーブル名 |
Role | ○ | Glueが使用するIAMロールのARN |
NumberOfWorkers | × | プロファイリングに使うワーカー数(デフォルト: 5) |
Timeout | × | タイムアウト分数(デフォルト: 2880 = 48時間) |
CreatedRulesetName | × | 指定すると推奨ルールを自動でルールセット保存 |
CLI操作 — 実行状態と結果の取得
# 実行状態の確認と推奨ルール取得 (正式API: GetDataQualityRuleRecommendationRun)
aws glue get-data-quality-rule-recommendation-run \
--run-id "dqrun-xxxxxxxxxxxxxxxxxxxx"
レスポンスの RecommendedRuleset フィールドにDQDLフォーマットの推奨ルールが直接返される。Status が SUCCEEDED になってから結果を取得すること(取り得る値: STARTING | RUNNING | STOPPING | STOPPED | SUCCEEDED | FAILED | TIMEOUT)。
精度の罠①: 推奨ルール取得APIの正式名称は
GetDataQualityRuleRecommendationRun(単数形・Run付き)。GetDataQualityRuleRecommendationsという名称のAPIはAWS Glue APIリファレンスに存在しない。混同すると実装時にエラーになるため注意。
90日後自動削除の制約
精度の罠②: 推奨ルール実行結果(RunIdに紐づくデータ)は90日後に自動削除される(公式ドキュメントに明記: “Recommendation runs are automatically deleted after 90 days.”)。RunIdが失効すると
GetDataQualityRuleRecommendationRunはエラーを返す。長期保存が必要な場合はRecommendedRulesetの内容をS3に書き出すか、CreatedRulesetNameでルールセットとして永続化しておく必要がある。§4-3に保存スクリプト例を掲載する。
4-2. データプロファイリング結果の解釈
推奨ルール生成はデータプロファイリング結果を入力として動作する。プロファイリングで収集される統計量を理解することで、提案されるルールの根拠と適切な閾値を判断できる。
プロファイリングで収集されるカラム統計
| 統計量 | 説明 | 主に対応するルールタイプ |
|---|---|---|
| NULL率 | NULL値が占める割合 | Completeness |
| ユニーク値数 | カラムの一意値の個数 | Uniqueness、IsPrimaryKey |
| 重複率 | 同一値が複数行に出現する割合 | Uniqueness |
| 最小値 / 最大値 | 数値・日付カラムの値域 | ColumnValues |
| 平均値 / 中央値 | 数値カラムの分布中心 | Mean |
| 標準偏差 | 数値カラムの散布度 | StandardDeviation |
| 値頻度分布 | 列挙型カラムの値とその出現割合 | ColumnValues(IN句) |
| データ型 | 実際の格納型 | ColumnDataType |
生成されるルール例と閾値の計算根拠
プロファイリングで「order_id カラムのNULL率が0%、ユニーク値数がレコード数と一致」と検出された場合、以下のルールが提案される:
Rules = [
Completeness "order_id" >= 1.0,
IsPrimaryKey "order_id",
Uniqueness "order_id" >= 0.99
]
閾値の計算根拠は「プロファイリング時の実測値 × 余裕率」である。order_id のNULL率が実測0%なら Completeness >= 1.0、ユニーク率が実測99.9%なら Uniqueness >= 0.99 が自動設定される。余裕率は統計値の安定度に応じてAWSのモデルが調整するが、チューニング時に手動で上書きする。
提案されるルールタイプのパターン
- Completeness: NULL率が低いカラム(業務キー・必須フィールド)に対して自動生成
- Uniqueness / IsPrimaryKey: ユニーク率が高いカラム(ID列・主キー候補)に対して生成
- ColumnValues(IN句): 値域が限定される列挙型カラム(ステータスコード・区分値)に対して生成
- ColumnDataType: 数値・日付型カラムの型整合性チェックとして生成
- Mean / StandardDeviation: 数値カラムの統計的範囲チェックとして生成
4-3. ルールチューニング
推奨ルールはデータの現状を基準にした初期提案であり、そのまま本番適用すると変動の許容範囲がなく誤検知が発生しやすい。実データ統計にバッファ率を加えたチューニングが品質ゲートの信頼性を左右する。
閾値最適化のアプローチ
基本方針は「実データ統計 ± バッファ率(5〜10%)」で閾値を設定することである。
| ルールタイプ | チューニング指針 | 例 |
|---|---|---|
| Completeness | 実測NULL率から許容余白を引く | 実測1.0 → 閾値0.95(5%バッファ) |
| Uniqueness | 業務上の重複許容度を判断して調整 | 実測0.999 → 閾値0.99 |
| ColumnValues(値域) | 季節変動・将来追加値を考慮して範囲を広げる | 価格レンジに10%マージンを加算 |
| Mean | 平均値の通常変動幅(±1σ)をもとに閾値を設定 | 実測平均100 → between 90 and 110 |
| DataFreshness | SLAの配信遅延許容時間をもとに設定 | 6時間遅延許容 → <= 6 hours |
優先度付け: FAIL vs WARN の使い分け
業務への影響度でルールをFAIL(パイプラインブロック)とWARN(通知のみ)に分類する:
- FAIL(業務クリティカル): 主キー欠損・NULL禁止フィールドの欠損・参照整合性違反。データを下流に渡すと業務損害が生じるもの
- WARN(補助指標): 平均値の軽微な変動・補助フィールドの欠損・将来追加予定の項目。モニタリング目的で記録するが処理は継続する
段階ロールアウト: WARN → FAIL の2段階移行
新規ルールを即FAIL設定すると予期しない品質違反でパイプラインが停止するリスクがある。段階移行で安全に本番適用する:
- 第1段階(警告期間: 2〜4週間): 全ルールをWARN閾値で設定。CloudWatch/EventBridgeで違反をモニタリングし、誤検知を洗い出す
- 第2段階(本番適用): 誤検知ゼロを確認した業務クリティカルルールのみFAIL閾値に昇格させ、補助指標はWARNのまま継続
チューニング後のDQDLルールセット実装例
Rules = [
# 業務クリティカル: FAIL設定(パイプラインをブロック)
Completeness "order_id" >= 1.0,
IsPrimaryKey "order_id",
Completeness "customer_id" >= 1.0,
ReferentialIntegrity "customer_id" "customers.customer_id" >= 0.99,
Completeness "order_date" >= 1.0,
ColumnDataType "order_date" = "DATE",
ColumnValues "status" in ["PENDING", "SHIPPED", "DELIVERED", "CANCELLED"],
ColumnValues "order_amount" > 0,
# 補助指標: WARN設定(段階ロールアウト — 誤検知確認後にFAIL昇格)
Completeness "shipping_address" >= 0.85,
Mean "order_amount" between 3000 and 80000,
Uniqueness "order_id" >= 0.995
]
長期運用: 推奨ルール結果の定期保存 (90日制限対策)
推奨ルール実行結果は90日で自動削除されるため、RunIdを長期保管するだけでは不十分である。以下のスクリプトで RecommendedRuleset の内容をS3に定期保存し、将来のルール見直し時の根拠データとして活用する:
#!/bin/bash
# 推奨ルール結果をS3にバックアップ (90日自動削除対策)
RUN_ID="dqrun-xxxxxxxxxxxxxxxxxxxx"
S3_BUCKET="s3://my-data-quality-archive"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
RESULT=$(aws glue get-data-quality-rule-recommendation-run \
--run-id "${RUN_ID}" \
--output json)
echo "${RESULT}" | python3 -c \
"import sys, json; print(json.load(sys.stdin).get('RecommendedRuleset', ''))" \
> /tmp/recommended_rules_${TIMESTAMP}.dqdl
aws s3 cp /tmp/recommended_rules_${TIMESTAMP}.dqdl \
"${S3_BUCKET}/recommended-rules/${RUN_ID}_${TIMESTAMP}.dqdl"
echo "Saved to ${S3_BUCKET}/recommended-rules/${RUN_ID}_${TIMESTAMP}.dqdl"
このスクリプトをEventBridgeスケジュール(月次等)またはStep Functionsのタスクとして呼び出すことで、推奨ルールの履歴管理と将来のルール再チューニング根拠として活用できる。CreatedRulesetName でルールセット保存した場合も、S3への二重バックアップを推奨する(ルールセット削除時の消失リスク対策)。
5. 2モード本番実装 — ETL組込み vs Data Catalog評価

5-1. ETL組込みモードの仕組みと実装
ETL組込みモードは、Glueジョブのデータ変換パイプライン内にData Quality評価を直接埋め込む方式だ。EvaluateDataQuality変換ステップがETLジョブ実行中にリアルタイムでルールを評価し、その結果に応じてジョブの継続・停止を制御できる。変換後のデータに対してインラインで品質ゲートを設けられるため、不良データを後続の書き込み処理や下流ジョブに流さない設計が実現できる。
EvaluateDataQuality と EvaluateDataQualityMultiFrame の違い
| 変換ステップ | 入力データフレーム数 | 主なユースケース |
|---|---|---|
| EvaluateDataQuality | 1個 | 単一ソースのETL品質チェック |
| EvaluateDataQualityMultiFrame | 複数個 | 結合後データや複数テーブル比較 |
EvaluateDataQualityMultiFrameは複数のGlue DynamicFrameを入力として受け取り、クロステーブルの整合性チェックやJOIN後のデータ品質評価が可能だ。トランザクションテーブルとマスターテーブルを結合した後の参照整合性を一括評価するケースなどで活用できる。
結果出力先の設定
ETL組込みモードの評価結果は2か所に出力される。
- S3(詳細ログ): 各ルールのPASS/FAIL判定・スコア・対象レコード数を含む詳細JSONがS3バケットに保存される。Athenaでの事後分析に活用できる。
- CloudWatch Metrics(スコア):
glue.data.quality.rules.passed/glue.data.quality.rules.failedメトリクスが送出される。アラーム設定で閾値超過時のSNS通知が可能だ。
どちらの出力もpublishing_optionsのenableDataQualityResultsPublishingおよびenableDataQualityCloudWatchMetricsフラグで明示的に有効化する必要がある。デフォルトはどちらも無効のため注意されたい。
ETL組込みモード実装例(Glue ETL Pythonスクリプト)
以下はGlue ETLジョブ(Glue Studioスクリプトモード)でのData Quality変換ステップの実装例だ。
import sys
from awsglue.transforms import EvaluateDataQuality, SelectFromCollection
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
args = getResolvedOptions(sys.argv, ["JOB_NAME"])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args["JOB_NAME"], args)
# ソースデータ読み込み
source_df = glueContext.create_dynamic_frame.from_catalog(
database="sales_db",
table_name="orders",
transformation_ctx="source_df"
)
# DQDLルールセット定義
ruleset = """
Rules = [
IsComplete "order_id",
IsComplete "customer_id",
ColumnValues "amount" > 0,
ColumnValues "status" in ["pending", "completed", "cancelled"],
IsPrimaryKey "order_id"
]
Analyzers = [
RowCount,
Completeness "customer_id"
]
"""
# EvaluateDataQuality 変換ステップ(S3 + CloudWatch 両方に出力)
dq_results = EvaluateDataQuality().process_rows(
frame=source_df,
ruleset=ruleset,
publishing_options={
"dataQualityEvaluationContext": "orders_quality_check",
"enableDataQualityResultsPublishing": True,
"resultsS3Prefix": "s3://my-datalake/dq-results/orders/",
"enableDataQualityCloudWatchMetrics": True,
},
additional_options={"performanceTuning.caching": "CACHE_NOTHING"},
)
# ルール評価結果を取得(ruleOutcomes / rowLevelOutcomes の2種)
rule_outcomes = SelectFromCollection.apply(
dfc=dq_results,
key="ruleOutcomes",
transformation_ctx="rule_outcomes"
)
# 品質ゲート: FAILルールがあればジョブを強制停止
failed_rules = rule_outcomes.toDF().filter("Outcome = 'Failed'")
if failed_rules.count() > 0:
raise Exception(
f"Data quality gate failed: {failed_rules.count()} rule(s) did not pass. "
"Check S3 results and CloudWatch metrics for details."
)
# 品質通過後の書き込み処理
glueContext.write_dynamic_frame.from_options(
frame=source_df,
connection_type="s3",
connection_options={"path": "s3://my-datalake/cleaned/orders/"},
format="parquet",
transformation_ctx="sink"
)
job.commit()
⚠ 精度の罠⑤:AnalyzersとDynamicRulesはETLモード専用
上記コード例のAnalyzers = [ RowCount, Completeness "customer_id" ]はETL組込みモードでのみ有効だ。Data Catalog評価モードでAnalyzersを記述しても評価実行時にエラーとなるため、Data CatalogモードのルールセットにはAnalyzersブロックを含めてはならない。DynamicRulesも同様にETLモード専用であり、Data Catalogモードでは非対応となっている。
5-2. Data Catalog評価モードの仕組みと実装
Data Catalog評価モードは、ETLジョブとは独立してGlueカタログに登録済みのテーブルを直接評価する方式だ。ETLパイプラインを持たない既存のS3テーブルや外部データソースへの定期品質チェックに適している。評価はスタンドアローンのジョブとして実行されるため、ETLジョブのスケジュールに縛られることなく品質チェックのみを独立して運用できる。
コンソールでの評価設定手順
- AWSコンソール → AWS Glue → Data Quality → ルールセット選択
- 「アクション」→「評価の実行」をクリック
- 実行対象として対象データベース・テーブルを指定(Data Catalogに登録済みのもの)
- IAMロール・ワーカータイプ・ワーカー数を設定
- 「スケジュール追加」でCron式を入力(定期実行の場合)
CLIでの評価実行
aws glue start-data-quality-ruleset-evaluation-runコマンドでの実行パラメータは以下の通りだ。
aws glue start-data-quality-ruleset-evaluation-run \
--data-source '{
"GlueTable": {
"DatabaseName": "sales_db",
"TableName": "orders"
}
}' \
--role "arn:aws:iam::123456789012:role/GlueDataQualityRole" \
--ruleset-names '["orders_catalog_ruleset"]' \
--number-of-workers 5 \
--worker-type "G.1X" \
--region ap-northeast-1
実行IDを取得したらaws glue get-data-quality-ruleset-evaluation-runでステータスを確認する。
aws glue get-data-quality-ruleset-evaluation-run \
--run-id "dqrun-xxxxxxxxxxxxxxxxxxxx"
レスポンスのStatusフィールドがSUCCEEDEDになれば評価完了だ。ResultIdsに含まれるIDを使ってget-data-quality-resultで詳細スコアを取得できる。
スケジュール実行設定(EventBridge Scheduler)
定期実行にはEventBridge Schedulerを使用するのが推奨だ。Glue Data QualityのコンソールからSchedulerを直接設定することもできるが、CLIでの設定例を示す。
aws scheduler create-schedule \
--name "orders-daily-dq-catalog-check" \
--schedule-expression "cron(0 3 * * ? *)" \
--flexible-time-window '{"Mode": "FLEXIBLE", "MaximumWindowInMinutes": 30}' \
--target '{
"Arn": "arn:aws:lambda:ap-northeast-1:123456789012:function:TriggerGlueDQEvaluation",
"RoleArn": "arn:aws:iam::123456789012:role/SchedulerInvokeLambdaRole",
"Input": "{\"databaseName\": \"sales_db\", \"tableName\": \"orders\", \"rulesetName\": \"orders_catalog_ruleset\"}"
}'
Lambda関数内でstart-data-quality-ruleset-evaluation-runを呼び出す構成が一般的だ。Lambda経由にすることで、評価完了後のSNS通知や結果の自動判定ロジックを組み込める。
Data Catalogモードの制約
⚠ Data Catalogモードの制約事項(精度の罠⑤)
- Analyzers非対応:Column統計Analyzerはデータの物理スキャンがETLコンテキストで行われるため、Data Catalogモードでは使用不可
- DynamicRules非対応:実行時パラメータを使う動的ルールはETLコンテキスト必須のため、Data Catalogモードでは評価エラーとなる
- 品質ゲート機能なし:ETLジョブの停止制御はできないため、不良データの流入防止にはETL組込みモードを使用すること
- マルチフレーム評価不可:複数テーブル間のクロス評価は
EvaluateDataQualityMultiFrame(ETLモード専用)が必要
5-3. モード選択基準と使い分け
2つのモードの選択はユースケースによって明確に分かれる。以下の比較表を判断の基準として使用されたい。
| 観点 | ETL組込みモード | Data Catalog評価モード |
|---|---|---|
| 評価対象 | 変換後データ(メモリ上DynamicFrame) | カタログ定義テーブル(S3/JDBC実データ) |
| 実行タイミング | ETLジョブ実行中(リアルタイム) | 定期バッチ(独立スケジュール) |
| Analyzers対応 | ✅ 対応 | ❌ 非対応 |
| DynamicRules対応 | ✅ 対応 | ❌ 非対応 |
| 品質ゲート機能 | ✅ 可能(ジョブ停止制御) | ❌ 不可(事後通知のみ) |
| マルチフレーム評価 | ✅ 対応(EvaluateDataQualityMultiFrame) | ❌ 非対応 |
| コスト特性 | ETLジョブコストに内包 | 評価ジョブとして単独課金 |
| ユースケース | リアルタイムETLパイプライン・品質ゲート | 既存テーブルの定期品質チェック |
ユースケース別の選択基準:
- ETLパイプラインの品質ゲート(不良データを後続処理に流さない)→ ETL組込みモード一択
- AnalyzersまたはDynamicRulesを使いたい→ ETL組込みモード必須(Data Catalogモード非対応)
- 既存S3テーブルの定期品質チェック(ETLジョブを持たないデータ)→ Data Catalog評価モード
- 複数テーブル間の整合性チェック→ ETL組込みモード(EvaluateDataQualityMultiFrame)
- コスト最適化(ETLジョブがなく品質チェックのみ実行したい)→ Data Catalog評価モードで評価ジョブのみ独立実行
6. 品質スコアの継続モニタリング

6-1. EventBridgeイベント連携
Glue Data Qualityはルールセット評価完了後にAmazon EventBridgeへイベントを自動Publishする。このイベントを捕捉することで、品質スコアのPASS/FAIL情報をリアルタイムで下流システムへ伝搬できる。
必須前提条件: “Publish metrics to CloudWatch”オプションの有効確認
EventBridgeへのイベントPublishには、Glue Data Qualityのジョブ設定で “Publish metrics to CloudWatch” オプションが有効になっている必要がある。AWSコンソールでのデフォルトは有効だが、CLIやCloudFormationで設定する場合は明示的な指定が必要。
ETL組込みモード(EvaluateDataQuality変換ステップ)では、PublishingOptionsで以下を指定する:
PublishingOptions = {
"EvaluationContext": "PRIMARY",
"ResultsS3Prefix": "s3://my-bucket/dq-results/",
"CloudWatchMetricsEnabled": True,# これが有効でないとEventBridgeイベントが発火しない
"ResultsPublishingEnabled": True
}コンソールでの確認手順: [AWS Glue] → [データ品質] → ジョブ設定の「CloudWatchへのメトリクス発行」チェックボックスをONに設定。Data Catalog評価モードの場合は評価スケジュール設定画面で同オプションを確認する。
EventBridgeイベントの正式名称とスキーマ
Glue Data Qualityがパブリッシュするイベントの正式名称は “Glue Data Quality Evaluation Results Available” である。このイベントはデフォルトイベントバス(default)に配信される。
イベントの基本属性:
| フィールド | 値 |
|---|---|
source | aws.glue |
detail-type | Glue Data Quality Evaluation Results Available |
region | 評価実行リージョン |
detailオブジェクトの主要フィールド:
| フィールド | 型 | 説明 |
|---|---|---|
rulesetNames | String[] | 評価したルールセット名のリスト |
resultIds | String[] | 結果IDのリスト(GetDataQualityResult APIに使用) |
state | String | 評価全体の状態: SUCCEEDED / FAILED |
score | Number | 品質スコア(0.0〜1.0のdecimal値) |
context | Object | 評価コンテキスト(ジョブ名・実行ID等) |
ルールごとのPASS/FAIL情報取得: GetDataQualityResult API連携
EventBridgeイベントのdetail.resultIdsを使ってGetDataQualityResult APIを呼び出すことで、ルールごとの詳細PASS/FAIL情報を取得できる:
import boto3
glue_client = boto3.client('glue', region_name='ap-northeast-1')
def get_rule_level_results(result_id: str) -> dict:
response = glue_client.get_data_quality_result(ResultId=result_id)
rule_results = response.get('RuleResults', [])
return {
'score': response.get('Score', 0.0),
'rules': [
{
'name': r.get('Name'),
'result': r.get('Result'), # 'PASS' or 'FAIL'
'description': r.get('Description'),
'evaluationMessage': r.get('EvaluationMessage')
}
for r in rule_results
]
}
EventBridge Ruleの設定手順(コンソール):
- [Amazon EventBridge] → [ルール] → [ルールを作成]
- イベントソース:
AWS のイベントまたはEventBridgeパートナーのイベント - イベントパターン(JSON)— 品質評価FAILED時のみ発火する設定:
{
"source": ["aws.glue"],
"detail-type": ["Glue Data Quality Evaluation Results Available"],
"detail": {
"state": ["FAILED"]
}
}
- ターゲット: Lambda関数(インシデント処理)またはSNSトピック(即時通知)を指定
上記パターンはFAILED(1件以上のルールFAIL)の場合のみ発火する。すべての評価結果を受信したい場合は"state"フィルタを省略する。CLIでのルール登録はaws events put-rule --event-patternコマンドで行い、aws events put-targetsでターゲットを紐付ける。
6-2. CloudWatchメトリクスとアラーム設定
正式メトリクス名(精度の罠③)
Glue Data QualityがCloudWatchへ送出するメトリクスの正式名称は以下の2つである:
| メトリクス名 | 説明 |
|---|---|
glue.data.quality.rules.passed | PASSしたルール数(品質スコアではなくルール件数を表す) |
glue.data.quality.rules.failed | FAILしたルール数(品質スコアではなくルール件数を表す) |
これらはルール数を示す指標であり、品質スコア(0.0〜1.0のdecimal値)そのものとは別の指標である点を必ず理解したうえで運用すること(精度の罠③)。品質スコアは評価結果JSONとEventBridgeイベントdetail.scoreフィールドから取得する。
メトリクスのディメンション:
| ディメンション名 | 説明 |
|---|---|
DataSource | 評価対象のデータソース名(Glueテーブル名等) |
RulesetName | 評価に使用したルールセット名 |
品質スコアをCloudWatchグラフで確認する際の注意点(精度の罠④):
品質スコアは0.0〜1.0のdecimal値として送出される。CloudWatchグラフで可視化する際は以下に注意する:
– Y軸の範囲を0.0〜1.0に固定設定する(自動スケールではrules.passedルール数と混在して判読不能になる)
– glue.data.quality.rules.passed / glue.data.quality.rules.failedのルール数グラフとは別ウィジェットにスコアを配置することを推奨
ルールFAIL件数アラームの設定(CLIコマンド):
aws cloudwatch put-metric-alarm \
--alarm-name "GlueDataQuality-RulesFailed-Alert" \
--alarm-description "Glue Data Qualityでルール失敗が1件以上発生" \
--namespace "Glue" \
--metric-name "glue.data.quality.rules.failed" \
--dimensions "Name=DataSource,Value=sales_db.daily_sales" \
"Name=RulesetName,Value=sales-quality-ruleset" \
--statistic Sum \
--period 300 \
--threshold 1 \
--comparison-operator GreaterThanOrEqualToThreshold \
--evaluation-periods 1 \
--alarm-actions "arn:aws:sns:ap-northeast-1:123456789012:data-quality-alerts" \
--treat-missing-data notBreaching
SNS通知連携 — AlarmAction設定:
# SNSトピック作成
aws sns create-topic --name data-quality-alerts --region ap-northeast-1
# メール通知サブスクリプション追加
aws sns subscribe \
--topic-arn "arn:aws:sns:ap-northeast-1:123456789012:data-quality-alerts" \
--protocol email \
--notification-endpoint "data-team@example.com"
# サブスクリプション確認メールの承認後、アラームからのSNS送信が有効化される
品質SLA閾値アラームの設定例(スコアベース):
# Lambda経由でカスタムメトリクスとして品質スコアをPutする場合のアラーム設定例
aws cloudwatch put-metric-alarm \
--alarm-name "GlueDataQuality-Score-SLA-Breach" \
--alarm-description "品質スコアがSLA閾値(0.95)を下回りました" \
--namespace "GlueDataQuality/Custom" \
--metric-name "QualityScore" \
--dimensions "Name=DataSource,Value=sales_db.daily_sales" \
--statistic Average \
--period 300 \
--threshold 0.95 \
--comparison-operator LessThanThreshold \
--evaluation-periods 1 \
--alarm-actions "arn:aws:sns:ap-northeast-1:123456789012:data-quality-alerts" \
--treat-missing-data notBreaching
CloudWatchダッシュボードには「ルール数ウィジェット(rules.passed/failed)」と「スコアウィジェット(カスタムメトリクス)」を分けて配置し、品質の多角的な可視化を実現する。
6-3. 異常検知とインシデント対応フロー
CloudWatch Anomaly Detectionは過去のメトリクスデータから機械学習モデルを構築し、統計的な正常範囲(バンド)を動的に定義する。品質スコアに日次・週次のサイクル変動がある場合、静的閾値より高精度で真の異常を検知できる。
静的閾値 vs CloudWatch Anomaly Detection の比較:
| 項目 | 静的閾値 | CloudWatch Anomaly Detection |
|---|---|---|
| 設定 | 固定数値(例: 0.95以下) | 自動学習(2週間以上のデータで精度安定) |
| 季節性対応 | なし | 時刻・曜日パターンを自動考慮 |
| 誤報リスク | 正常な変動でもアラート | 正常変動を許容し真の異常のみ検知 |
| 導入コスト | 低(即設定可) | 学習期間が必要(最低2週間推奨) |
Anomaly Detection型アラームのCLI設定:
# Anomaly Detection用モデル作成(2週間以上のデータ蓄積後に実行推奨)
aws cloudwatch put-anomaly-detector \
--namespace "Glue" \
--metric-name "glue.data.quality.rules.failed" \
--dimensions "Name=DataSource,Value=sales_db.daily_sales" \
--stat Sum
# Anomaly Detection型アラームの作成
aws cloudwatch put-metric-alarm \
--alarm-name "GlueDataQuality-AnomalyDetection" \
--alarm-description "Glue Data Quality異常値検知(動的閾値)" \
--metrics '[
{"Id":"q1","Expression":"ANOMALY_DETECTION_BAND(m1,2)","Label":"AnomalyBand"},
{"Id":"m1","MetricStat":{"Metric":{"Namespace":"Glue","MetricName":"glue.data.quality.rules.failed","Dimensions":[{"Name":"DataSource","Value":"sales_db.daily_sales"}]},"Period":300,"Stat":"Sum"}}
]' \
--comparison-operator GreaterThanUpperThreshold \
--threshold-metric-id q1 \
--evaluation-periods 1 \
--alarm-actions "arn:aws:sns:ap-northeast-1:123456789012:data-quality-alerts"
品質スコア急落検知フロー:
① EventBridge受信 (Glue Data Quality Evaluation Results Available)
↓ detail.state == "FAILED" または detail.score < 0.9
② Lambdaトリガー: GetDataQualityResult → FAILルール特定
↓
③ Slack通知 (担当チャンネル) + 夜間はPagerDuty/OpsGenie
↓
④ 担当者確認: どのルールがFAILか・上流データ変更有無
↓ 原因確定
⑤ 対応分岐:
A) 上流データ問題 → ETL一時停止 → データ修正 → 再実行
B) 閾値設定問題 → DQDLルール閾値見直し → 再評価
↓
⑥ 品質スコア改善確認 → インシデントクローズ → S3ログ記録
Lambda経由Slack通知の実装例:
import boto3
import urllib.request
import json
SLACK_WEBHOOK = "https://hooks.slack.com/services/T000/B000/XXXX"
def lambda_handler(event, context):
detail = event.get('detail', {})
score = detail.get('score', 'N/A')
state = detail.get('state', 'UNKNOWN')
result_ids = detail.get('resultIds', [])
glue = boto3.client('glue')
failed_rules = []
for rid in result_ids:
result = glue.get_data_quality_result(ResultId=rid)
for rule in result.get('RuleResults', []):
if rule.get('Result') == 'FAIL':
failed_rules.append(f"{rule.get('Name')}: {rule.get('EvaluationMessage', '')}")
message = {
"text": (
f":warning: *Glue Data Quality Alert*\n"
f"*State:* {state} | *Score:* {score}\n"
f"*Failed Rules ({len(failed_rules)}件):*\n"
+ "\n".join(f" • {r}" for r in failed_rules)
)
}
req = urllib.request.Request(
SLACK_WEBHOOK,
data=json.dumps(message).encode(),
headers={"Content-Type": "application/json"}
)
urllib.request.urlopen(req)
return {"status": "notified", "failed_rule_count": len(failed_rules)}
インシデントログのS3保存:
インシデントログをS3に蓄積することで、長期的なパターン分析(特定ルールの再発傾向・季節性)や監査対応が可能になる。Lambdaハンドラ末尾に以下を追加する:
import boto3
import json
from datetime import datetime, timezone
s3 = boto3.client('s3')
INCIDENT_BUCKET = "my-data-quality-incidents"
def save_incident_log(event_detail: dict, failed_rules: list):
now = datetime.now(timezone.utc)
incident = {
"timestamp": now.isoformat(),
"event_detail": event_detail,
"failed_rules": failed_rules,
"resolution": "pending"
}
key = f"incidents/{now.strftime('%Y/%m/%d/%H%M%S')}.json"
s3.put_object(
Bucket=INCIDENT_BUCKET,
Key=key,
Body=json.dumps(incident, ensure_ascii=False),
ContentType="application/json"
)
S3に蓄積したインシデントログはAthenaでクエリ可能であり、§7-1で設計するトレンド可視化ダッシュボードと統合することで、品質ガバナンスの全体像を一元管理できる。
7. 品質トレンド可視化とデータ品質駆動ガバナンス

7-1. 品質スコアのS3蓄積とAthena可視化
Data Quality評価結果はS3へ自動出力される。この出力先を統一されたS3パスに集約し、Athenaで外部テーブルとして定義することで、品質スコアの時系列分析が可能になる。
S3出力パスの設定:
ETL組込みモードではPublishingOptions.ResultsS3Prefixで出力先を指定する。複数ジョブの結果を集約するために、パスを以下の構造に統一することを推奨する:
s3://my-data-quality-bucket/
results/
year=2026/month=06/day=28/
dqrun-abc123.json
dqrun-def456.json
評価結果JSONのスキーマ説明:
{
"evaluationContext": "PRIMARY",
"score": 0.923,
"rulesetEvaluationRunId": "dqrun-abc123",
"startedOn": "2026-06-28T10:00:00Z",
"completedOn": "2026-06-28T10:05:00Z",
"dataSource": {
"glueTable": {
"databaseName": "sales_db",
"tableName": "daily_sales"
}
},
"rulesetName": "sales-quality-ruleset",
"ruleResults": [
{
"name": "Rule_1",
"description": "Completeness \"customer_id\" >= 0.99",
"result": "PASS",
"evaluationMessage": "Completeness check passed with value 0.997"
},
{
"name": "Rule_2",
"description": "Uniqueness \"order_id\" >= 0.999",
"result": "FAIL",
"evaluationMessage": "Uniqueness check failed with value 0.985"
}
]
}
Athena外部テーブルDDL(評価結果JSONに対するEXTERNAL TABLE定義):
CREATE EXTERNAL TABLE data_quality_results (
evaluationContextSTRING,
scoreDOUBLE,
rulesetEvaluationRunId STRING,
startedOn STRING,
completedOnSTRING,
dataSource STRUCT<
glueTable: STRUCT<
databaseName: STRING,
tableName: STRING
>
>,
rulesetNameSTRING,
ruleResultsARRAY<
STRUCT<
name: STRING,
description: STRING,
result: STRING,
evaluationMessage: STRING
>
>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ('serialization.format' = '1')
LOCATION 's3://my-data-quality-bucket/results/'
TBLPROPERTIES ('has_encrypted_data'='false');
サンプルAthenaクエリ — 週次品質劣化ワーストTOP5:
SELECT
dataSource.glueTable.databaseName || '.' ||
dataSource.glueTable.tableName AS table_name,
rulesetName,
DATE_FORMAT(
CAST(FROM_ISO8601_TIMESTAMP(completedOn) AS DATE),
'%Y-W%v'
) AS week,
ROUND(AVG(score), 4) AS avg_score,
MIN(score)AS min_score,
COUNT(*) AS eval_count
FROM data_quality_results
WHERE score < 0.95
AND completedOn >= DATE_FORMAT(
DATE_ADD('week', -4, CURRENT_DATE),
'%Y-%m-%dT00:00:00Z'
)
GROUP BY 1, 2, 3
ORDER BY avg_score ASC
LIMIT 5;
QuickSightダッシュボード構成:
品質モニタリングダッシュボードは以下3ウィジェットで構成することを推奨する:
| ウィジェット | 可視化タイプ | 指標 |
|---|---|---|
| 品質スコア推移グラフ | 折れ線グラフ | 日次avg_score per テーブル |
| ルール別PASS率ヒートマップ | ピボットテーブル | ルール名 × 週 のPASS率 |
| 部門別SLA達成率 | 棒グラフ | avg_score ≥ SLA閾値の割合 |
QuickSightからAthenaへの接続はデータソース設定で「Amazon Athena」を選択し、対象データベース・テーブルを指定するだけでデータセット作成が完了する。リアルタイム性が必要な場合はSPICEではなくDirect Queryモードを選択し、Athenaクエリコストと更新頻度のバランスを考慮して運用設計を行う。
7-2. 品質SLAとビジネス指標の連動
部門・データドメイン別のSLA定義テンプレート:
| 部門 | データドメイン | 品質スコア下限 | 評価頻度 | 違反時対応 |
|---|---|---|---|---|
| 営業 | 顧客マスタ | 0.99 | 日次 | ETL停止・即時通知 |
| マーケティング | キャンペーンデータ | 0.95 | 日次 | 条件付き利用・翌日再評価 |
| 財務 | 売上集計 | 0.999 | 毎時 | ETL停止・エスカレーション |
| データ分析 | BIマート | 0.90 | 週次 | 注記付きで継続利用 |
| 機械学習 | 特徴量テーブル | 0.95 | 学習実行前 | 学習ジョブ停止 |
SLAはドメイン責任者(データオーナー)と合意のうえで設定し、YAMLやTerraformで管理してGitでバージョン管理することを推奨する。
品質スコアとデータ使用可否判定の3段階ルール:
Glue Data Qualityの品質スコア(0.0〜1.0)に基づく使用可否判定を以下のように定義する:
| スコア範囲 | 判定 | 対応内容 |
|---|---|---|
| 0.95 以上 | ✅ 利用可 | 下流ジョブへ通常供給 |
| 0.90〜0.95 | ⚠️ 条件付き利用 | 品質注記を付与して利用・翌日再評価 |
| 0.90 未満 | ❌ 利用停止 | 下流ジョブへの供給を停止・品質修復チームへエスカレーション |
下流分析ジョブの品質ゲート実装(Lambda):
import boto3
glue_client = boto3.client('glue', region_name='ap-northeast-1')
sfn_client = boto3.client('stepfunctions', region_name='ap-northeast-1')
QUALITY_GATE_THRESHOLD = 0.95
DOWNSTREAM_STATE_MACHINE_ARN = (
"arn:aws:states:ap-northeast-1:123456789012:stateMachine:DownstreamETL"
)
def lambda_handler(event, context):
ruleset_name = event['rulesetName']
# 最新の評価結果を取得
runs = glue_client.list_data_quality_results(
Filter={'RulesetName': ruleset_name},
MaxResults=1
)
if not runs.get('Results'):
raise ValueError(f"No quality results found for: {ruleset_name}")
latest_score = runs['Results'][0].get('Score', 0.0)
if latest_score >= QUALITY_GATE_THRESHOLD:
# 品質ゲートPASS → 下流ジョブ起動
sfn_client.start_execution(
stateMachineArn=DOWNSTREAM_STATE_MACHINE_ARN,
input=f'{{"source":"quality_gate","score":{latest_score}}}'
)
return {"status": "LAUNCHED", "score": latest_score}
else:
raise Exception(
f"Quality gate FAILED: score={latest_score} < threshold={QUALITY_GATE_THRESHOLD}"
)
Step Functionsによる品質ゲート統合(ステートマシン定義の骨格):
{
"StartAt": "CheckDataQuality",
"States": {
"CheckDataQuality": {
"Type": "Task",
"Resource": "arn:aws:lambda:ap-northeast-1:123456789012:function:QualityGateChecker",
"Next": "LaunchDownstreamETL",
"Catch": [{
"ErrorEquals": ["QualityGateFailed"],
"Next": "NotifyFailure"
}]
},
"LaunchDownstreamETL": {
"Type": "Task",
"Resource": "arn:aws:states:::glue:startJobRun",
"Parameters": {"JobName": "downstream-analytics-etl"},
"End": true
},
"NotifyFailure": {
"Type": "Task",
"Resource": "arn:aws:states:::sns:publish",
"Parameters": {
"TopicArn": "arn:aws:sns:ap-northeast-1:123456789012:data-quality-alerts",
"Message": "品質ゲートFAIL: 下流ETLを停止しました"
},
"End": true
}
}
}
Step Functionsを利用することで、品質ゲート確認・条件分岐・通知を宣言的なワークフローとして管理でき、コードの複雑化を防ぐことができる。
7-3. データ品質駆動ガバナンスサイクル
品質スコアの継続改善には、計測→検知→分析→改善→再評価のPDCAサイクルを実装する。このサイクルを自動化することで、品質劣化を早期発見してデータ信頼性を継続的に向上させられる。
PDCAサイクルの実装フロー:
① 品質スコア計測 (Plan)
Glue Data Quality評価実行 → S3出力 + CloudWatchメトリクス送出
② 閾値違反検知 (Do)
CloudWatchアラーム発火 → EventBridge → Lambdaトリガー
GetDataQualityResult APIでFAILルール特定
③ 原因分析 (Check)
FAILルールのevaluationMessageを確認
例: "Completeness check failed with value 0.85, expected >= 0.99"
パターンA: 上流データ品質問題(NULLデータ増加・スキーマ変更等)
パターンB: DQDLルール閾値が実データ統計と乖離している
④ DQDLルール改善または上流修正 (Act)
パターンA → データエンジニアに上流修正依頼・ETL一時停止
パターンB → 閾値を実データ統計ベースに再設定
改善後はルールセットをGit管理してバージョン記録を残す
⑤ 再評価・スコア確認
Glue Data Quality再実行 → スコア改善を確認
改善不足の場合はステップ③に戻る
⑥ ルールセット確定・承認フロー
承認済みルールセットをTerraform/CloudFormationでコード化
本番環境への反映はPull Request + レビュー経由で実施
Before/Afterルールセット比較(閾値最適化の実例):
品質改善の成功パターンとして、閾値を実データ統計から算出する例を示す。
Before(初期設定 — 過度に厳格な閾値でFAIL多発):
Rules = [
Completeness "email" >= 0.99,
Uniqueness "user_id" >= 0.999
]
評価結果: Completeness "email" FAILが毎日発生(実際の完全率は0.94前後)
After(実データ統計に基づく現実的な閾値):
Rules = [
Completeness "email" >= 0.92,
Uniqueness "user_id" >= 0.999,
ColumnValues "email" matches "^[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}$" >= 0.85
]
評価結果: 実際の問題(形式不正メール)のみ検知し、NULL許容フィールドでの誤アラートが解消。閾値0.92はデータサンプリング調査の結果(完全率平均0.94 – 2σ ≈ 0.92)から算出した。
データリネージの補足的活用:
品質スコアが急落した際の原因追跡において、データリネージ(AWS Glue Data Catalog の依存グラフ・Amazon DataZone のリネージビュー)は補助ツールとして有用である。上流テーブルとの依存関係を確認し、「どのETLジョブが品質劣化を持ち込んだか」を特定する際の参考情報として活用できる。ただし本Vol3ではリネージを主軸にはせず、あくまでDQDLルールのFAIL分析が品質ガバナンスの中心軸である。
品質改善指標のKPIトラッキング:
PDCA効果を定量評価するために、以下の指標を週次でAthenaクエリして記録することを推奨する:
| KPI | 計算式 | 目標 |
|---|---|---|
| 平均品質スコア | AVG(score) by dataset/week | 0.95以上を維持 |
| SLA違反件数 | COUNT(score < sla_threshold) / week | 前週比20%減少 |
| 平均修復時間(MTTR) | AVG(resolved_at – detected_at) | 24時間以内 |
| ルール改善頻度 | COUNT(ruleset_version_updates) / month | 月次レビュー実施 |
これらのKPIを経営層向けダッシュボード(QuickSight)に組み込むことで、データ品質への投資対効果(ROI)を可視化し、ガバナンス施策への継続的なリソース確保につなげられる。§7-1のAthena外部テーブルとKPIクエリを組み合わせることで、品質スコアの長期トレンドと改善速度の両方を一元管理できる。
8. まとめ・DQコストと Vol1/Vol2 双方向クロスリンク
8-1. Vol3 実装チェックリスト
Vol3で解説した本番実装を確実に展開するためのチェックリストです。全項目を確認してから本番運用を開始してください。
IAM・権限設定
- [ ] IAM権限
glue:StartDataQualityRulesetEvaluationRun、glue:GetDataQualityResult、glue:BatchGetDataQualityResultをGlue実行ロールに付与済み - [ ] 推奨ルール生成権限
glue:StartDataQualityRuleRecommendationRun、glue:GetDataQualityRuleRecommendationRunを付与済み - [ ] CloudWatchメトリクス書き込み権限
cloudwatch:PutMetricDataをGlue実行ロールに付与済み - [ ] S3評価結果出力バケット書き込み権限
s3:PutObjectを付与済み
DQDLルールセット設計
- [ ] DQDLルールセット作成完了(Completeness / Uniqueness / ColumnValues / ColumnLength 等の本番ルールを含む)
- [ ] 推奨ルール自動生成(
StartDataQualityRuleRecommendationRun)を実行し、生成ルールの統計値を確認済み - [ ] 生成ルールの閾値チューニング(±10〜20%バッファ追加)と不要ルール削除済み
- [ ] ETL組込みモード または Data Catalog評価モード の適切なモードを選択済み
モニタリング設定
- [ ]
"Publish metrics to CloudWatch"オプションを有効化済み(EventBridgeイベント発火の前提条件) - [ ] EventBridge Rule:
"Glue Data Quality Evaluation Results Available"イベントの受信ルール設定済み - [ ] CloudWatchアラーム:
glue.data.quality.rules.failedメトリクスの閾値アラーム設定済み - [ ] SNS通知連携確認済み(アラーム → SNS → 担当者通知)
結果の可視化・分析
- [ ] S3評価結果出力先バケット・パスを設定し、評価結果JSONの出力確認済み
- [ ] Athenaテーブル作成・評価結果クエリ確認済み(品質スコアの時系列集計)
- [ ] QuickSightダッシュボード設定済み(データセット接続・KPIビジュアル作成)
運用体制
- [ ] 品質SLA閾値(例: スコア0.9以上)定義済み
- [ ] インシデント対応手順(品質ゲート停止 → 原因分析 → 修正 → 再評価フロー)整備済み
- [ ] 推奨ルール実行結果90日自動削除対策(実行結果をS3またはDynamoDBに保存するスクリプト)設定済み
- [ ] Vol1/Vol2との双方向クロスリンク設置確認済み
8-2. Glue Data Quality コスト試算
Glue Data Qualityの料金はGlue ETLと同様に DPU時間(Data Processing Unit-Hour) ベースで課金されます。
料金体系の基本
| 課金要素 | 単価(東京リージョン) | 備考 |
|---|---|---|
| DPU時間(ETL組込みモード) | $0.44 / DPU-hour | 最低2 DPU・10分単位切り上げ |
| DPU時間(Data Catalog評価) | $0.44 / DPU-hour | 最低2 DPU・10分単位切り上げ |
| 推奨ルール生成(RuleRecommendationRun) | $0.44 / DPU-hour | プロファイリング込みで通常評価より高コスト |
| CloudWatchカスタムメトリクス | $0.30 / メトリクス/月 | 最初の10,000メトリクスはこの単価 |
| S3ストレージ(評価結果) | $0.025 / GB/月 | 評価結果JSONは通常軽微 |
月額コスト試算例(テーブル10件×1日1回評価)
前提条件:
– 評価対象テーブル: 10件
– 評価実行時間: 1回あたり平均5分(最低10分単位切り上げ)
– DPU数: 2 DPU(最小構成)
– 評価頻度: 1日1回(月30日稼働)
計算式:
月間評価回数 = 10テーブル × 30日 = 300回
DPU-hour = 300回 × (10分 ÷ 60分) × 2 DPU = 100 DPU-hour
評価コスト= 100 DPU-hour × $0.44 = $44/月
推奨ルール生成コスト(月1回の場合):
– プロファイリング+ルール生成: 平均20分 × 2 DPU × 10テーブル = 66.7 DPU-hour
– コスト: 66.7 × $0.44 ≈ $29(毎月定期実行する場合)
– 初回のみ or 大幅なデータ変化時のみの実行に限定するとコスト削減効果が大きい
月額合計(概算):
| 項目 | 月額コスト |
|---|---|
| 定常評価(10テーブル×1日1回) | $44 |
| CloudWatchカスタムメトリクス(10メトリクス) | $3 |
| S3ストレージ(評価結果JSON) | $1未満 |
| 合計 | 約$48/月 |
コスト最適化ポイント
- 評価頻度の最適化: 重要テーブルは毎日評価、低重要テーブルは週次評価に変更するだけで50%以上削減可能
- 対象テーブルの優先順位付け: 下流への影響が大きいマスタデータ・KPIテーブルを最優先に選定し、全テーブル一律評価は避ける
- サンプリング活用: 大規模テーブルはサンプリング(例: 1,000万件中100万件)で評価精度を維持しながら実行時間を短縮
- 推奨ルール生成の頻度制御: 月1回または四半期1回に限定し、定常評価とコスト管理を分離する
最新の料金は AWS Glue 料金ページ で確認してください。DPU単価・最低課金時間は変更される場合があります。
8-3. シリーズまとめ — 3巻で完成するデータガバナンス体制
Vol1からVol3にかけて、AWSデータガバナンスの三層を段階的に積み上げてきました。
Vol1(カタログ・統制基盤): DataZone によるデータポータルとビジネスデータカタログ、Lake Formation による統制基盤、Clean Rooms による安全なデータコラボレーションを確立しました。データを「見つけられる・管理できる」状態の実現が第一の柱です。
Vol2(きめ細かいアクセス制御): LF-Tag ベースの属性型アクセス制御、行・セルレベルのきめ細かいフィルタリング、データメッシュアーキテクチャ、Macie による機密データ自動検出を実装しました。データを「適切な人だけが・適切な粒度で」利用できる体制が第二の柱です。
Vol3(品質保証・モニタリング): DQDL によるルールセット定義、推奨ルール自動生成、ETL組込み/Data Catalog評価の2モード選択、EventBridge/CloudWatch連携による品質スコア継続モニタリングと品質ゲート実装を完成させました。データを「信頼できる品質で」提供するサイクルの確立が第三の柱です。
3巻を通じて「発見性(Vol1)→ アクセス制御(Vol2)→ 品質保証(Vol3)」の層を順に積み上げることで、本番データレイクに必要な完全なガバナンス体制が完成します。Vol1の統制基盤の上にVol2のアクセス制御が成り立ち、その上でVol3の品質保証サイクルが継続的に機能するという三層構造が、AWS データガバナンスの設計原則です。品質スコアの劣化検知 → 原因分析 → DQDLルール改善 → 再評価のPDCAサイクルを継続することで、データ基盤全体の信頼性を長期的に維持できます。
8-4. 次のステップ
Vol3でAWS Glue Data Quality を中心とした品質保証レイヤを構築しましたが、データ品質管理のエコシステムはさらに広がりを持っています。
他のデータ品質ツールとの比較・補完
Amazon Deequ: Apache Spark ベースのオープンソースデータ品質ライブラリで、AWS Glue ETL ジョブ内から直接呼び出せます。DQDL で表現しにくい複雑なカスタム検証ロジックを Scala/Python で記述したい場合の補完ツールとして有効です。
Great Expectations: Python エコシステムで広く使われる汎用データ品質フレームワークです。AWS 外のデータソースやマルチクラウド環境との品質管理統合が必要な場合の選択肢になります。
AWS Glue Data Quality の位置づけ: IAM / CloudWatch / EventBridge / Lake Formation との統合が最もシンプルで、AWS 中心のデータ基盤では第一選択です。マネージドサービスとして運用コストが低い点も本番環境での優位点です。
データカタログとの統合強化
Vol1で構築した DataZone データカタログに品質スコアを連携することで、データポータル上でデータの鮮度・品質状態をコンシューマが直接確認できる体制を構築できます。AWS Glue Data Quality の評価結果を Glue Data Catalog のテーブルメタデータとして記録し、DataZone のビジネスカタログに反映するアーキテクチャが推奨される次の拡張です。
品質駆動のデータメッシュ高度化
Vol2で構築したデータメッシュアーキテクチャとVol3の品質評価を組み合わせることで、ドメインごとの品質SLAを自動で検証し、品質基準を満たさないデータプロダクトをメッシュから切り離す自律型ガバナンスの実現が可能になります。各ドメインの Data Product オーナーが品質ルールを自律管理しながら、中央の統制基盤がSLAコンプライアンスを自動監視する体制が次の進化形です。