Microsoft PurviewでAmazon S3上のCSVファイルをクロールしてみる

# はじめに
最近Microsoft Purviewを触る機会がきたので、試しにS3上のファイルをスキャンしてメタデータを取り込んでみました。
以下のドキュメントを参考に実施しました。
https://learn.microsoft.com/ja-jp/azure/purview/register-scan-amazon-s3

# Microsoft Purviewとは
ドキュメントには以下のように記載があります。
>Microsoft Purview は、組織がデータ資産全体を管理、保護、管理するのに役立つデータ ガバナンス、リスク、コンプライアンス ソリューションのファミリです
https://learn.microsoft.com/ja-jp/purview/purview

わかりづらいので簡単に説明すると、組織内の複数の場所に分散しているデータの情報(メタデータ)を収集して一元的に管理し、データを統制しながら横断的にデータ活用するための機能を提供しているサービスになります。
今回はその一部の機能であるData Mapを使用して取り込み、Data Catalogで取り込んだメタデータの確認をしていきます。

# 前提
- Azureアカウント作成済み
- Microsoft Purviewアカウント作成済み
- AWSアカウント作成済み
- CSVファイルをSJISからUTF-8に変換済み
- S3バケットの作成とCSVファイル配置済み([サンプルファイルはこちらを使用](https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00200521&tstat=000001011777&cycle=0&tclass1=000001094741))
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/e6dcbda3-f45e-2ea4-ab09-325c2717882b.png)


# 実施内容
## Purivewからのアクセス用にAWS側でIAMロールを作成
AmazonS3ReadOnlyAccessポリシーをアタッチしたazure-purview-access-s3-roleロールを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/e0ad7432-d994-97ba-87eb-242eb4101fae.png)

信頼ポリシーは以下を設定します。
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789123:root"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "sts:ExternalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
                }
            }
        }
    ]
}
```

### Microsoft側のAWSアカウントIDと外部IDの確認方法
IAMロールの信頼ポリシーにはMicrosoft側のAWSアカウントIDと外部IDを設定する必要があるので、Microsoft Purviewのガバナンスポータルから事前に確認しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/f7b2a9c8-892a-8e9c-f0c6-c311f206c8cf.png)

### IAMロール作成時のアカウントIDと外部IDの指定
確認したアカウントIDと外部IDをIAMロール作成画面で以下のように設定することで、信頼ポリシーに自動的に設定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/1d2fe1ab-c2bd-273e-7255-eb743ad395dc.png)

## Purivewの資格情報へのIAMロールARN値設定
先ほど作成したIAMロールのARN値をMicrosoft Purviewガバナンスポータルの資格情報に登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/80e14dcc-a571-ba96-3abb-befb6e379680.png)

## ソースの登録
資格情報が登録できたらクロール対象のソースを登録していきます。
データマップからソースの登録を押下して、対象のソースの種類を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/be12e7a3-b108-2756-6c1f-18895a9a962b.png)

次の画面でS3バケットのURL(※パスは含まない)と紐づけるコレクション(グルーピングされたデータの管理単位)を選択して登録を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/feb19b3c-06bf-beb0-3a70-cb2013091bb7.png)

ソースにS3が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/c22fa1e9-7892-403b-2beb-594e5aec59e4.png)

これだけではスキャンが行われていないため、データソースのメタデータはまだ登録されていません。
ソースのS3の詳細を選択してスキャンを実行していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/78b9f6ba-9e63-225a-6c62-0c34f370319e.png)

## データソースをスキャン
ソースのS3の詳細画面から新しいスキャンを押下して、スキャン名・使用する資格情報・紐づけるコレクション、を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/ddfc1c8d-b308-2000-0edb-ba788a429d5c.png)

少し待つとデータソースの構成が表示されるので、スキャンを行う際のスコープを指定します。
今回はutf8変換をしたフォルダ配下のみスキャンしたいので、以下のように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/d1c98ab9-46bf-f771-d9f5-0f482f951312.png)

次にS3上のファイルをスキャンするルールを設定します。
今回はデフォルトで用意されているシステムルールセットにあるAmazonS3ルールを使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/92937aa8-7fee-d011-2780-7b18d65db30c.png)

AmazonS3のルールセットが既に表示されているので、そのまま次の画面に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/e6269211-26c1-3be8-c8f8-4efc7fc99ba3.png)

スキャントリガーの設定ですが、今回は繰り返し実行はしないので、一度だけ実行するように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/a43875cf-0233-06ef-0795-32e4697670a3.png)

保存して実行ボタンを押下すると、すぐにスキャンが開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/70eed534-2ac5-77f4-1cca-909e7e445e26.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/cc6f2d8f-92e2-f771-da36-070b6af3e554.png)

スキャンはキューに登録後、順次実行されていくので、定期的に最新の情報に更新すると処理が開始されたかを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/e1f92017-5b43-63ec-b3cc-ea750e3c4934.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/f97aa8f9-7079-b9c9-d351-74adccbe6ef7.png)

しばらくしたらスキャンが完了しました。
そこまでデータサイズはないはずですが、思ったよりもかかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/b7cc5378-b0a6-02e4-dc55-bcdc69046a29.png)

## スキャン後データ確認
ガバナンスポータルのデータカタログから登録されたメタデータを確認することができます。
特に指定はしていなかったですが、CSVファイル名からアンダースコアと数値を除いた英語部分がリソースセットの名前になっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/36917f5f-0f2e-490f-823b-b0c5d3ffe1bc.png)

CSVに含まれていたスキーマも登録されていますし、プロパティにはファイルサイズや取得元のデータソースの情報が登録されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/2517e00f-969b-e998-5490-481faffbb169.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/ef3584ab-259c-7be3-b407-3263b31a556f.png)

## おまけ
せっかくデータソースをS3にしているので、Glueからもクロールしてみました。

スキャン時間は1分かからず終わって、Glue Data Catalogには以下のように登録されていました。
Azure側ではすべてのカラムのデータ型がstringになっていましたが、AWSでは一部のカラムのデータ型がbigintとして登録されていました。
この辺りの違いはサービスの裏側で使用されている仕組みの問題か、データソースと同じクラウドサービスを利用しているからなのか、どちらもありそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/6e68f903-7f7c-8d05-c65c-b52ac62683df.png)

こう見比べてみると、Azure側はデータ統制するためにGUI上での操作や可視化に特化しているのに対して、GlueはGUIからというよりはシステムから利用されることに特化して設計されてるのが良くわかります。
サービスの目的から違うのだと思いますが、実際に触ってみるとその違いが良くわかるので面白かったです。

# おわりに
普段Azureを触る機会はほとんどないので、試しに触ってみる良い機会になりました。
また、他のサービスを触る機会があれば書いてみようと思います。