Glue DataQualityをAWS CLIで作成や実行してみる

# はじめに
そろそろre:Inventですね。今年はどんなアップデートが出てくるか楽しみです。
今回は、去年のre:Inventで発表されたAWS Glue Data QualityをAWS CLIで触ってみようと思います。
具体的には、ルールを作って実行して確認する、以下の4つのステップを実行してみます。
1. ルールを作成する
2. ルールを実行する
3. 実行情報の確認
4. 結果の確認

# 前提条件
- 東京リージョンで実施
- Cloud9で実施
- AWS CLIはv2にバージョンアップ済み
    - Cloud9はv1が入っているので、v2にバージョンアップしました
- 事前にGlue DataQualityが実行できるロールを用意しておく
- テストのテーブルとして、Glueデータカタログのテーブルを用意しておく
    - 今回は、以下のようなテーブルを作成済み

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/5c550d30-a170-a6ae-3428-f62bbae318ab.png)


# やってみる
## 1. ルールを作成する
[create-data-quality-ruleset](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/create-data-quality-ruleset.html) を実行します。`--target-table` は任意のパラメータですが、カタログのテーブルに紐づくことが確定しているのでこの時点で指定しておきます。

```bash
aws glue create-data-quality-ruleset \
--name category_check_test \
--ruleset 'Rules=[ColumnValues "category" in ["1", "2", "4"]]' \
--target-table \
'{
  "TableName": "item_table",
  "DatabaseName": "20231126_dq_test_db",
  "CatalogId": "999999999999"
}'
```

:::note warn
`CatalogId` はAWSアカウントIDを入れてください。
:::

レスポンスは以下となります。ルール名が返ってきていますね。

```bash
{
    "Name": "category_check_test"
}
```

:::note info
今回は、「categoryカラムの値が1,2,4のどれかであること」というルールセットを作成しています。ルールセットを定義する記法は、以下のリファレンスをご確認ください。
:::

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/dqdl.html

## 2. ルールを実行する
[start-data-quality-ruleset-evaluation-run](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/start-data-quality-ruleset-evaluation-run.html) を実行します。`--data-source` は必須のパラメータです（さっきと同じ情報をまた入力しないといけないのがちょっと面倒…）。

```bash
aws glue start-data-quality-ruleset-evaluation-run \
--role role_name \
--ruleset-names category_check_test \
--data-source \
'{
  "GlueTable": {
    "DatabaseName": "20231126_dq_test_db",
    "TableName": "item_table",
    "CatalogId": "999999999999"
  }
}'
```

:::note warn
実行時のパラメータの `--role` には事前に作成している実行ロール名を入れます。また、`CatalogId` は1.と同じくAWSアカウントIDを入れてください。
:::

レスポンスは以下となります。ルールの実行ジョブは非同期実行となりますので、ジョブの状況を確認するためのRunIDが返ってきています。

```bash
{
    "RunId": "dqrun-4d8916785b2d6aa8d2d98a99e35df435d0182a1e"
}
```

## 3. 実行情報の確認
[get-data-quality-ruleset-evaluation-run](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-data-quality-ruleset-evaluation-run.html) を実行します。先ほどのレスポンスのRunIDをここで指定します。

```bash
aws glue get-data-quality-ruleset-evaluation-run --run-id dqrun-4d8916785b2d6aa8d2d98a99e35df435d0182a1e
```

レスポンスは以下となります。ジョブが成功している場合は `Status` にSUCCEEDEDが入り、`ResultIds`の値も存在します。一方、まだ実行中の場合は`ResultIds`が存在しません。そのため、スクリプトで情報を取るときは、`ResultIds`が存在しないことも考慮してスクリプトを組む必要があります。

```bash
{
    "RunId": "dqrun-4d8916785b2d6aa8d2d98a99e35df435d0182a1e",
    "DataSource": {
        "GlueTable": {
            "DatabaseName": "20231126_dq_test_db",
            "TableName": "item_table",
            "CatalogId": "999999999999"
        }
    },
    "Role": "arn:aws:iam::999999999999:role/role_name",
    "NumberOfWorkers": 5,
    "Status": "SUCCEEDED",
    "StartedOn": "2023-11-26T08:21:14.365000+00:00",
    "LastModifiedOn": "2023-11-26T08:22:47.632000+00:00",
    "CompletedOn": "2023-11-26T08:22:47.632000+00:00",
    "ExecutionTime": 76,
    "RulesetNames": [
        "category_check_test"
    ],
    "ResultIds": [
        "dqresult-d32c7b6a4a2c24dbeea8ba9254ba1468e74f2b37"
    ],
    "AdditionalDataSources": {}
}
```

## 4. 結果の確認
[get-data-quality-result](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-data-quality-result.html) を実行します。先ほどのレスポンスのResultIdsをここで指定します。

```bash
aws glue get-data-quality-result --result-id dqresult-d32c7b6a4a2c24dbeea8ba9254ba1468e74f2b37
```

レスポンスは以下となります。今回のチェックの結果は**FAIL**となっていますね。用意したデータのcategoryカラムは1,2,3の値が入っていますが、ルールセットでは1,2,**4**が入っていることと定義したので、チェックはFAILで意図通りの挙動です。

```bash
{
    "ResultId": "dqresult-d32c7b6a4a2c24dbeea8ba9254ba1468e74f2b37",
    "Score": 0.0,
    "DataSource": {
        "GlueTable": {
            "DatabaseName": "20231126_dq_test_db",
            "TableName": "item_table"
        }
    },
    "RulesetName": "category_check_test",
    "StartedOn": "2023-11-26T08:22:14.493000+00:00",
    "CompletedOn": "2023-11-26T08:22:22.671000+00:00",
    "RulesetEvaluationRunId": "dqrun-4d8916785b2d6aa8d2d98a99e35df435d0182a1e",
    "RuleResults": [
        {
            "Name": "Rule_1",
            "Description": "ColumnValues \"category\" in [\"1\",\"2\",\"4\"]",
            "EvaluationMessage": "Value: 0.7142857142857143 does not meet the constraint requirement!",
            "Result": "FAIL",
            "EvaluatedMetrics": {}
        }
    ]
}
```

# 他の操作
ここからは、ルールセットを色々試行錯誤した時に実行するであろう操作も記載しておきます。

## ルールを修正する
[update-data-quality-ruleset](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/update-data-quality-ruleset.html) を実行します。今度はルールも1,2,3とデータに即した値に修正します。

```bash
aws glue update-data-quality-ruleset --name category_check_test \
--ruleset 'Rules=[ColumnValues "category" in ["1", "2", "3"]]'
```

レスポンスは以下となります。

```bash
{
    "Name": "category_check_test",
    "Ruleset": "Rules=[ColumnValues \"category\" in [\"1\", \"2\", \"3\"]]"
}
```

このルールを実行して結果を確認する場合は、上記の2.~4.をまた実行します。

## ルールを削除する
[delete-data-quality-ruleset](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/delete-data-quality-ruleset.html) を実行します。試行錯誤用のルールを作成した場合は、実際に定期実行するルールと混じってしまうので消しておきましょう。

```bash
aws glue delete-data-quality-ruleset --name category_check_test
```

レスポンスはありません。

# おわりに
AWS CLIを使って、Glue DataQualityの各操作を実施してみました。
ジョブが非同期のため、実行状態や実行結果を取得するために操作が必要なことに注意です。
また、公式ドキュメントにはboto3を使った例も記載がありますので、併せてご参照ください。

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/data-quality-using-apis.html