DataZone（プレビュー）に既存のGlueデータカタログを取り込みパブリッシュ/サブスクライブする

# はじめに
DataZone（プレビュー）を少し触ってみたので、備忘録的に記事にします。
現在、AWSでデータレイクを構築している場合、既存のGlueデータカタログが存在していると思います。それをDataZoneの管理下に置くというユースケースを想定し、実施してみました。

こちらのドキュメントを参考に実施しました。

https://docs.aws.amazon.com/datazone/latest/userguide/create-glue-data-source.html

# 前提条件
- 2023年7月22日に、DataZone（プレビュー）を利用して検証しています。GA時にはUIや挙動が変わる可能性があります。
- 米国東部 (バージニア北部)リージョン（us-east-1）を利用します。
- 既にドメインやプロジェクトは作成しています。
- 既にクローラーを実行し、取り込むGlueデータカタログは作成しています。
- 今回は、全てAdminユーザーで実行します。

# やってみる

## 既存のデータカタログを確認する
データベース `test-dz-db` が作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/51b6eefa-ab76-ffe4-1d17-f9f56bad3d0e.png)

そのデータベースに、2つのテーブル `test_1` `test_2` が作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/38476c87-0847-9c2a-9af9-872dc104d9aa.png)

それぞれのテーブルにAthenaからクエリできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/c1ab34e8-26e6-edb6-774b-4bf0a68d6df2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/141c1be9-781f-34ac-8e4c-8298a43cd0fa.png)

## DataZoneでデータソースを作成する
DataZoneのコンソール画面から、自身のドメインをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/9b05982e-8758-48ba-46c4-2f311ab54043.png)

データソースタブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/16a3dab2-94e5-707b-34ba-54ef63d28561.png)

ドメインをフィルタリングをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/771f4fed-f4bc-9cc6-c994-38dfd885b10b.png)

データを取り込みたい対象のサブドメインを選択し、ドメインを選択をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/f56f736b-e241-1d44-65fc-515c5ca439c6.png)

データソースを作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/0a2b7784-7911-2efc-c9ae-5c9307a8dc3d.png)

ここからは、データソースを作成の項目を埋めていきます。一部注意が必要なものだけ記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/4ea6c7b3-3a99-524c-a6bb-4bef0afb3010.png)

AWS Glue データカタログのロールを読み取る：既存のロールはないので、新規に作成します。
アクセスロールを管理：こちらも同じく、新規に作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/b2668ccf-67f8-25c5-195f-52a7081c6ff2.png)

プロジェクト：データソースを追加したいプロジェクトを選択します。このプロジェクト内で、このGlueデータカタログのデータがパブリッシュできるようになります。
データベース：今回用意した `test-dz-db` を選択します。

全て入力したら、データソースを作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/7288c1d8-a4a6-d046-61bc-8788e3a0e644.png)

データソースが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/52b3fd17-006d-075f-474d-d4274ee6f5db.png)

## Lake Formationで権限設定する
パブリッシュする前に、先ほどデータソースを作成した際に新規作成したIAM Roleに、Lake Formationで権限を付与します。
具体的には、以下のドキュメントに記載された作業を実施していきます。

https://docs.aws.amazon.com/datazone/latest/userguide/lake-formation-permissions-for-data-source-roles.html

Lake FormationのData Lake locationsで、Register locationをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/d2473c3e-82a3-0682-4368-8a9ec4880de2.png)

Amazon S3 path：Glueデータカタログの元データが保存されているS3バケットを入力します。
それ以外は特にいじらず、Register locationをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/d07845fe-8e4d-055c-b9d1-5d6ba774860f.png)

Data lake permissionsをクリックして、検索欄に `IAMAllowedPrincipals` を入力し、エンターを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/6607116f-5806-e3da-1546-08cf2c86adc9.png)

さらに検索欄に今回追加するデータベース `test-dz-db` を入力し、エンターを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/1c364168-d243-4ed7-590c-4301bde7667e.png)

3つのPrincipalに対してRevokeを実施します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/725f150e-8969-5d0b-c3e6-86c1b911cca3.png)

:::note warn
`IAMAllowedPrincipals` のpermissionsが残っていると、Lake Formationでの権限管理ではなくIAMでの管理となってしまいます。DataZoneはLake Formationの権限管理を使うため、このpermissionsはRevokeします。
:::

次は、先ほどデータソースを作成した時に新規作成した2つのロールに権限を付与します。
これをしないと、DataZoneが既存のGlueデータカタログを読み取れません。
Grantをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/85b014c9-bf86-9e6b-04cb-e512268b6e92.png)

1つ目のDataSourceのロールは、以下のようにデータベースとテーブルを選択し、Table permissionsは**Describeのみ**を許可します。その後、Grantをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/3ed1dafa-57a5-dc9b-b0a6-c9c5f22cd002.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/e3d83c5c-0ed4-1881-3414-8bb35bd80ddc.png)

2つ目のPublisherManagedのロールは、以下のようにデータベースとテーブルを選択し、Table permissionsは**SelectとDescribe**、Grantable permissionsも**SelectとDescribe**を許可します。その後、Grantをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/600ab521-6663-8566-12a0-0b2ac95e388a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/41db8b81-3637-c141-cfeb-263d548c8255.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/44aa56a9-519f-74fb-960a-500d8c22667e.png)

以上で、権限設定は完了です。

## DataZoneでパブリッシュする
ここからは、DataZoneのデータポータル上で操作します。

自身のProjectをクリックし、PUBLISH DATAをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/c26df367-d786-297b-e77e-ee7ef58fbeb3.png)

Publishデータに関する情報を入力していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/43916856-9440-b64b-3f90-3d27f4044ddb.png)

Publishing agreement：今回は、defaultを選択します。
Data source：今回作成したデータソースである `test-data-catalog` を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/d4516088-69b6-2b74-051c-0e59f1ffa845.png)

Database name：今回作成したデータソースの元のデータベース名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/7831d919-da7c-b4c8-1ac9-c8028536bb3f.png)

Data Asset publishing：今回はActiveを選択します。Activeはパブリッシュの承認処理を挟まず、いきなりパブリッシュします。本番運用ではDraftを選択して、承認処理を挟んだ方が良いかと思います。
全て入力したら、CREATE PUBLISHING JOBをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/48ab477d-cc3e-3700-d223-aa0ada8092e5.png)

ジョブが実行されます。3分で成功となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/e4ff8a66-836d-79cb-2289-b56c28ca8c03.png)

2つのテーブルが無事にパブリッシュされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/522132d7-2360-7718-d0bf-1d8238460c5c.png)

## DataZoneでサブスクライブする

パブリッシュされたうちの1つの `test_1` をクリックして、詳細ページを開きます。
その後、SUBSCRIBEをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/89228add-3c4e-c9d9-7793-72a5e881274c.png)

Project：サブスクライブしたいプロジェクトを選択します。
その下にはサブスクライブの理由を入力しますが、今回はtestとします。
その後、SUBSCRIBEをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/2a8652fd-d505-2aa8-1246-489724420a8b.png)

少し経つと、右上のチェックマークにオレンジ色の●が表示されるのでクリックし、Subscription Requestをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/de7b022c-4b80-3ea9-fd24-efd4fe02cd2d.png)

View requestをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/37440e8b-35c5-9a58-d55e-abd8acbbb63e.png)

APPROVEをクリックします。
これで、サブスクライブが承認されたことになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/3452b653-bcdb-b5d8-95d6-7a6c99db5c89.png)

左のメニューから、サブスクライブしたプロジェクトをクリックすると、test_1がサブスクライブされています！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/6f37aeb9-a279-6b15-5526-74d4caaf471a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/35354153-0532-5f59-8ce2-e7884e1793b5.png)

## クエリ発行する
先ほどサブスクライブしたプロジェクトの右側にあるQuery dataをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/47c99e93-c74e-6f4b-3de6-c261a8cd4c5f.png)

Athenaの画面に飛ぶので、データベース名に `_sub_db` がつくデータベースを選択すると、今回サブスクライブしたテーブルがあるので、それにクエリを発行します。
見事に見えていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/d39517d8-c89e-08cf-9eff-3ff2e56ea51d.png)

# 注意点
## ①実運用の際の作業ユーザーについて
今回は、全ての作業をAdminユーザーで実行しました。
しかし、実運用の際はそれぞれのプロジェクトのユーザーやデータスチュワードが操作する場合があるのでご注意ください。

## ②Lake Formationで権限設定し忘れた場合について
その場合でも、パブリッシュ/サブスクライブまでは出来ちゃいます。
ただ、サブスクライブしたデータを見ると、以下のように `Not granted` と表示され、クエリできない状態になります。
これは、データソースを作成した際に新規作成したロールが、データカタログを見に行けなかったためです。忘れないようにしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/3c235db9-994e-0d6d-cfdf-ed852db071fc.png)

# おわりに
DataZoneは権限管理が楽になるサービスですが、AWS上に存在しているリソースをDataZoneの世界に乗せてあげる必要があります。今回はロールなどを新規に作成した、かつAdminで作業したので簡単にいきましたが、既存のロール、ユーザー、VPC･･･など使うと躓くところが増えそうです。早くGAして実際の環境で試してみたいですね！！