AWS Glue Data Quality(プレビュー) をAWS Glueコンソールから試してみよう!

AWS Glue Data Quality(プレビュー) をコンソールから試してみたのでご紹介します。特に必要なIAMロールも作成してみました。
2023.02.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部の鈴木です。

AWS Glue Data Quality(プレビュー) をGlueのコンソールから試してみました。データ分析基盤や機械学習システムで非常に重要なデータ品質についてGlueの機能を使って非常に簡単にチェックすることができる機能です。

以前の記事でre:Invent2022のAWS Glue Data Qualityの紹介セッションである『[NEW] Monitor & manage data quality in your data lake with AWS Glue』を紹介しましたが、このセッションで中心に語られたようなGlueのコンソールの操作を実際に試せていなかったので、実際に触ってみました。

なお、Glue Stuioからの利用を例にした紹介は以下の記事で取り上げられています。

実際動かしてみたところ、セッション動画でみた通り、非常に簡単で使いやすく驚きました。IAMロールの準備で少し試行錯誤したので、これから触ってみたい方向けに、今回作ってみたIAMロールも紹介しつつ、この機能についてご紹介します。

AWS Glue Data Qualityについて

AWS Glueのネイティブなデータ品質の管理機能です。AWSの開発したOSSであるDeequによるデータ品質チェックを、AWS Glueのサーバレスかつマネージドな環境上で非常に簡単に実行できる機能となります。

AWS Glueコンソールからは個別のテーブルの画面から利用でき、誰でも簡単に品質ルールが作成できるDQDL(Data Quality Definition Language)という独自の言語でルールを定義し、品質チェックが実行できます。

やってみる

S3バケットに格納したデータに対して、AWS Glue Data Qualityによる品質チェックを実行する操作を試してみたので、ご紹介します。

1. データの準備

今回は下記リンクにて公開されている、UCI Machine Learning RepositoryのIris Data Setを使用しました。

  • https://archive.ics.uci.edu/ml/datasets/iris

データをダウンロードし、iris.dataをS3バケットにアップロードしておきます。

分析対象のファイル

以下のように、動作検証に使っていいデータベースに、iris_quality_checkテーブルを作成しました。データを置いたS3バケット名データを置いたパスはデータを置いた場所に合わせて変えておきます。

CREATE EXTERNAL TABLE IF NOT EXISTS iris_quality_check (
  `sepal_length` float, 
  `sepal_width` float, 
  `petal_length` float, 
  `petal_width` float, 
  `class` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat'
LOCATION
  's3://データを置いたS3バケット名/データを置いたパス'
TBLPROPERTIES (
  'classification'='csv', 
  'columnsOrdered'='false', 
  'compressionType'='none', 
  'delimiter'=',')

このようにデータの検索ができるようにしておきました。

検索結果例

2. IAMロールの準備

AWS Glue Data Qualityを実行する際に、コンピューティングリソースが稼働するときは以下の2パターンです。

  • ルールセットの生成:データを元にDQDLで記述されたルールセットを生成する。
  • 品質チェックの実行:テーブルのデータに対して品質チェックを実行する。

必要なIAMロールの権限は以下の開発者ドキュメントに記載がありますが、各々に必要な権限が異なります。

今回は以下のように2種類のIAMロールを作成できるようにCloudFormationテンプレートを用意しました。このテンプレートをCloudFormationからデプロイすることで、実行に必要な2つのIAMロールを作成することが可能です。

ポイントとしては、ドキュメントにyaml形式で記載されている定義は共通で必要なものだけなので、それに加えてS3バケットなど必要なリソースへのアクセスを状況に合わせて追加することです。今回は試行錯誤しつつできるだけ権限が狭くなるように定義してみましたが、より厳密にしたい方は適宜修正して頂ければと思います。

データのあるS3バケット名・テーブル名とそのデータベース名についてはパラメータとして渡せるようになっているので、検証する環境に合うものを入力してください。

AWSTemplateFormatVersion: "2010-09-09"
Description: Creating Role for Glue Data Quality 

Parameters:
  S3BucketName:
    Description: Backet Name for Target Data.
    Type: String
  GlueDatabaseName:
    Description: Glue Database for Target Data.
    Type: String
  GlueTableName:
    Description: Glue Table for Target Data.
    Type: String

Resources:
  # Permissions to get recommended data quality rules
  IAMRoleForRecommendRules:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: glue.amazonaws.com
            Action: "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: GlueDataQualityPolicy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: "Allow"
                Action: [
                  "glue:GetDataQualityRuleRecommendationRun",
                  "glue:PublishDataQuality",
                  "glue:CreateDataQualityRuleset"
                ]
                Resource: [
                  !Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:dataQualityRuleset/*"
                ]
              - Effect: Allow
                Action:
                  - "s3:GetObject"
                Resource: [
                  "arn:aws:s3:::aws-glue-*"
                ]
              - Effect: "Allow"
                Action: [
                  "glue:GetTable",
                  "glue:GetPartitions"
                ]
                Resource: [
                  !Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:catalog",
                  !Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:database/${GlueDatabaseName}",
                  !Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:table/${GlueDatabaseName}/${GlueTableName}"
                ]
              - Effect: Allow
                Action: [
                  "s3:ListBucket",
                  "s3:GetObject"
                ]
                Resource: [
                  !Sub "arn:aws:s3:::${S3BucketName}",
                  !Sub "arn:aws:s3:::${S3BucketName}/*"
                ]
  # Permissions to run a data quality task
  IAMRoleForRunDataQuality:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: glue.amazonaws.com
            Action: "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: GlueDataQualityPolicy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:

              - Effect: Allow
                # glue:GetDataQualityRulesetは広めにつけてもよいと思ったので、ほかのGlueへのActionとまとめた。
                Action:   [
                  "glue:GetDataQualityRulesetEvaluationRun",
                  "glue:PublishDataQuality",
                  "glue:GetDataQualityRuleset"
                ]
                Resource: [
                  !Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:dataQualityRuleset/*"
                ]
              - Effect: Allow
                Action:
                  - "s3:GetObject"
                Resource: [
                  "arn:aws:s3:::aws-glue-*"
                ]
              - Effect: Allow
                Action:
                  - "cloudwatch:PutMetricData"
                Resource: "*"
              - Effect: Allow
                Action: [
                  "s3:PutObject*"
                ]
                Resource: [
                  !Sub "arn:aws:s3:::${S3BucketName}/*"
                ]
              - Effect: Allow
                # チェック対象のデータを取得できるように権限をつけました。
                Action: [
                  "s3:ListBucket",
                  "s3:GetObject"
                ]
                Resource: [
                  !Sub "arn:aws:s3:::${S3BucketName}",
                  !Sub "arn:aws:s3:::${S3BucketName}/*"
                ]
              - Effect: "Allow"
                Action: [
                  "glue:GetTable",
                  "glue:GetPartitions"
                ]
                Resource: [
                  !Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:catalog",
                  !Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:database/${GlueDatabaseName}",
                  !Sub "arn:aws:glue:${AWS::Region}:${AWS::AccountId}:table/${GlueDatabaseName}/${GlueTableName}"
                ]

3. ルールセットの生成

DQDLで定義したルールセットは、AWS Glue Data Qualityの機能を使って推奨されるものをデータから生成することができます。

まず、対象のテーブルのData qualityタブを開き、Recommend rulesetを押します。

ルールセットの推薦

ルールセット名と、実行に必要なIAMロールを設定します。IAMロールにはルールセットの生成に使う方を設定します。必要であればAdditional configurationsからワーカー数とタイムアウトの時間を設定することもできます。

推薦の実行

Recommend rulesetを押して実行します。

しばらく待って、Run StatusがCompletedになることを確認します。

推薦タスクの実行結果

4. ルールセットの編集(任意)

Rulesetsのセクションに表示されているルールセット名のリンクを押すと、その詳細を確認することができます。

ルールセットの詳細の確認

生成されたルールセット

Actionsから編集や削除ができます。

編集

編集する場合は、編集画面から定義を修正し、Update rulesetを押します。

ルールセットの修正

5. 品質チェックの実行

実行したいルールセットを選択し、Evaluate rulesetを押します。

ルールセットを選択する

品質チェック実行用のIAMロールを選択します。必要であればワーカー数やデータ品質チェックの結果を格納するS3の場所を指定します。上記で紹介したIAMロールは、この画面でCloudWatchへのメトリクス発行やS3バケットへの結果の格納をする前提で権限設定をしています。Evaluate rulesetを押すとチェックが実行されます。

ルールセットの実行

Data quality resultsタブから実行結果を確認することができます。しばらく待つとRun statusCompletedになれば成功です。各ルールの評価状況はDQ result欄に表示されます。今回は一つ違反するルールがあったようです。画面下のセクションで、どのルールが違反したかとその詳細も確認できますね。

実行結果の確認

最後に

今回は現在プレビューのAWS Glue Data Qualityを試してみたい方向けに、AWS Glueコンソールからの使い方と、実行に必要なIAMロールの例をご紹介しました。

コンソールからの実行以外にも、冒頭で紹介したブログのようなGlue Studioから実行できたり、既にAWS SDK for Python (Boto3)からも実行することが可能なようです。

DQDLでは欠損値の有無のチェックや要約統計量などの計算に加え、あるカラムがPKとしての条件を満たしているかなど、多くの方が確認はしたいものの自作すると意外と大変だなと思っていたであろう品質チェックをサポートしており、この記事でご紹介した通りとても簡単に実行できます。

プレビュー段回ではあるものの、ご興味がある方はぜひ試してみてください。