DataZoneのProject capabilitiesについてまとめてみた

:::note warn
本記事はプレビュー版のDataZoneのドキュメントやサービスを利用しているため、GAで内容が変更となる場合がある点についてご了承ください。
:::

皆さん、8月に入り夏真っ盛りですが、DataZoneはお使いになっていますでしょうか。
実際にDataZoneを使おうとすると、Projectを作成していくわけですが、RedshiftをProjectで扱おうとするとこのProject capabilitiesを理解しないと進めない問題にぶち当たります。
私が早々にぶち当たったため、本記事でまとめておこうと思います。

# DataZoneにおけるProject capabilities
## Projectとは
そもそもProjectとはなんでしょうか。
公式ページのよくある質問には以下のような記載があります。

https://aws.amazon.com/jp/datazone/faqs/#:~:text=%E5%8C%96%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-,%E3%83%87%E3%83%BC%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88,-%3A%20%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88

>データプロジェクト: ユーザー、データアセット、および分析ツールのビジネスユースケースベースのグループを作成することにより、AWS 分析へのアクセスを簡素化します。Amazon DataZone プロジェクトは、プロジェクトのメンバーが協力し、データを交換し、アーティファクトを共有できるコラボレーションスペースを提供します。プロジェクトでは、明示的に追加されたユーザーのみがデータおよび分析ツールにアクセスできます。各プロジェクトは、データスチュワードが適用するポリシーに従って各プロジェクト内で生成されたデータアセットの所有権を管理し、フェデレーションガバナンスを通じてデータ所有権を分散化します。

ざっくり私の理解したところで言うと、**DataZoneで管理できるまとまりの最小単位**という認識です。
例えば、データを見せる/見せないという権限管理の最小単位はこのProjectです。1つのProjectには、複数のメンバー、パブリッシュデータ、サブスクライブデータが紐づきます。Projectの単位でサブスクライブ（購読）したデータは、Projectに紐づくメンバー全員が見えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/23773a41-308b-31af-9b16-534c749167bc.png)


## Project capabilitiesとは
では改めて、Project capabilitiesとは何でしょうか。プロジェクトケーパビリティ、直訳すると**プロジェクトの能力**です。言葉通りの意味で、そのProjectでできることを意味します。
現在のプレビュー版のDataZoneでは、このProject capabilitiesは6つ定義されており、Projectを新規作成するときにユーザー側で選択できるようになっています（正確に言うと、Project profileを介して設定しますが、後述します）。

例えばその1つとして、**Data Lake Default Capability**があります。このCapabilityがあれば、DataLake（S3）に存在するデータをサブスクライブ/パブリッシュでき、参照できるデータに対してAthenaでクエリを投げられます。具体的には、以下のようなことができるようになります（ちなみに、Projectを新規に作成するとデフォルトで設定されるCapabilityです）。

- データのパブリッシュ
    - プロジェクトのS3バケットにデータを作成し、さらにデータカタログ化してデータをパブリッシュする
    - 既存のデータカタログをデータソースとして追加してデータをパブリッシュする
- データのサブスクライブ
    - DataZoneのデータカタログで、他Projectからパブリッシュされたデータ群を検索し、気に入ったデータを指定してサブスクライブする
- データのクエリ
    - 自身がサブスクライブしたデータに対して、Athenaのクエリエディタを開いてクエリを実行する

Data Lake Default Capabilityが付与されたProjectの画面の右側には、以下のような表示がされています。
この`Query data`をクリックすればAthenaのクエリエディタに、`S3 Bucket`をクリックすればProjectのS3バケットに飛びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/691e12a8-b60b-9cc0-d689-b12e7e66d4d1.png)

## Project capabilitiesの種類

https://docs.aws.amazon.com/datazone/latest/userguide/reviewing-project-capabilities.html

公式ドキュメントを参考にすると、以下の6種類があります。
Projectごとに1つだけを選ぶのではなく、複数選択することが可能です。

| Capability名 | 説明 | 作成されるリソース |
| ---- | ---- | ---- |
| Essential capability | Amazon DataZoneプロジェクトの他の選択されたサービスを使用するための前提条件。 | AWS KMSキー、IAMロール、Amazon S3バケット、Amazon CloudWatchロググループ、Amazon S3用VPCインターフェース、Amazon CloudWatch用VPCインターフェース。 |
| Data Lake Default Capability | ドメイン作成時に作成されたデフォルトのプロジェクトプロファイルを使用してプロジェクトを作成すると、デフォルトで選択されます。または、独自のカスタムプロジェクトプロファイルを作成するときにこの機能を選択することもできます。<BR>このケイパビリティによって、Amazon DataZoneプロジェクトのメンバーは、プロジェクト内でDataLakeのプロデューササービスとコンシューマサービスを起動できるようになります。	 | このデフォルトは、ユーザーがAthenaを使用してLake Formationテーブルを作成し、クエリする機能を提供します。 |
| Data Lake Consumer Capability | Amazon DataZoneプロジェクトのメンバーは、Amazon Athenaやその他のLake Formationがサポートするクエリーエンジンで、Lake Formationが管理するアセットの「読み取り専用」コピーに直接アクセスすることができます。 | Amazon Athena ワークグループ、'read only' Lake Formation パーミッションを持つ AWS Glue データベース、'read only' IAM パーミッション、AWS Glue 用の VPC インターフェースエンドポイント、Amazon Athena 用の VPC インターフェースエンドポイント、プロジェクトが管理する Amazon S3 へのアクセス。 |
| Data Lake Producer Capability | Amazon DataZoneプロジェクトメンバーが、Amazon Athenaを使用して新しいLake Formation管理テーブルを作成し、Amazon DataZoneカタログに公開できるようにします。 | Lake Formation権限の'create'と'grant'、IAM権限の'read'と'write'、タグ付けのAWS Glue ETL（抽出、変換、ロード）を備えたAWS Glue データベース。
| Data Warehouse Consumer Capability | Amazon DataZone プロジェクトメンバーが自分の Amazon Redshift クラスターに接続して、リモートデータストアにクエリを実行したり、新しいデータセットを作成して保存したりできるようにします。 | Amazon Redshift クエリエディタへのアクセス、Amazon DataZone カタログからのサブスクライブ済みデータソースへの「読み取り」アクセス、設定された Amazon Redshift クラスターでローカルデータアセットを作成する機能。 |
| Data Warehouse Producer Capability | Amazon DataZone プロジェクトメンバーが、自分の Amazon Redshift クラスターに接続して、リモートデータストアにクエリを実行したり、新しいデータセットを作成したり、それらを Amazon DataZone カタログに公開したりできるようにします。 | Amazon Redshift クエリエディタへのアクセス、Amazon DataZone カタログからのサブスクライブ済みデータソースへの「読み取り」アクセス、設定された Amazon Redshift クラスターからアセットを作成して公開する機能。 |

## Project capabilitiesの選択具体例
やりたいことベースで考えると、以下のような選択になります。

- ① DataLake（S3）データを公開、参照したい（KMSやS3バケットの設定などは大体できれば良い）
    - Data Lake Default Capability
- ② DataLake（S3）データを公開、参照したい（KMSやS3バケットの設定など詳細に設定したい）
    - Essential capability
    - Data Lake Producer Capability
    - Data Lake Consumer Capability
- ③ DataLake（S3）データを参照だけしたい（公開はしなくてよい）
    - Essential capability
    - Data Lake Consumer Capability
- ④ DWH（Redshift）データを公開、参照したい
    - Essential capability
    - Data Warehouse Producer Capability
    - Data Warehouse Consumer Capability
- ⑤ DWH（Redshift）データを参照だけしたい（公開はしなくてよい）
    - Essential capability
    - Data Warehouse Consumer Capability

Essential capabilityは、KMSキーやVPCエンドポイントなどが使えるようになるCapabilityなので、どの場合でも必須で付与します（Data Lake Default Capabilityを選んだ場合のみ、Essential capabilityは選ばなくても大丈夫です。というか同時に選べません。デフォルトでついているだけあって、その内容も包含されているようです）。
また、DataLakeもDWHもProducer Capabilityを付与すると自動的にConsumer Capabilityも付与されます。Producer Capabilityのみの付与はできませんでした。

①と②の「DataLake（S3）データを公開、参照したい」の違いについては、まだ調査中です。ただ、設定できる項目に以下のような違いがありました。

**Data Lake Default Capability**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/3b2a6346-eb40-3a0c-f917-5ada510773cd.png)

**Essential capability**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/4b7d3ed2-8d68-82a6-af11-de055769e0ef.png)

# 実際の設定方法
実際にProjectに設定する際は、**Project profile**にProject capabilitiesを設定して、その**Project profile**をProjectに紐づけます。EC2のIAMインスタンスプロファイルのようなイメージでしょうか。それぞれの具体的な設定方法を記載します。

## Project profileの作成
画面左下のCatalog managementからDomainsをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/9fcc417b-b60b-7d0d-f553-348e5157dd68.png)

Capabilityを設定したいドメインを選択します。

:::note info
Project capabilityはProjectに紐づきますが、Project profileはドメインごとに作成できます。ドメイン管理者が前もってProject profileを作成しておき、プロジェクト管理者がその中から選んでProjectに付与する運用になるかと思います。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/d84c142d-1db9-6365-dedb-d71604a88a13.png)

PROJECTS AND ACCOUNTSタブ→PROJECT PROFILESタブをクリックし、CREATE PROJECT PROFILEをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/f9e5ae5a-682c-3a3b-4b98-3012ba1e40cc.png)

以下の項目を入力し、CREATE PROJECT PROFILEをクリックします。
Project capabilitiesの項目が、**Project capabilitiesの種類**で説明したものですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/1ea949c3-7c6f-d623-2aad-ce4f9aee5495.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/4195005e-500c-5f13-b7e6-c6ccedfb87e5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/bd87bcab-a05c-5fbf-1e15-151c4fb1b0e7.png)

## Projectへの設定
ポータル左側の、MY PROJECTS横の+ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/45303560-2a6f-54f7-42e3-01f52ab1d816.png)

以下の項目を入力し、CREATE PROJECTをクリックします。
Project profileの項目に、先ほど作成したProject profileを設定します。
Projectの作成は数十分ほどかかる場合があるので気を付けてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/6a64e4a0-3cd5-e014-1f86-7c488b6676ae.png)

## Project capabilitiesの確認

作成されたProjectをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/66dd443c-dbc0-d5aa-bd30-ea2f0c7b4b51.png)

SETTINGタブをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/abb8e408-43bd-756e-8fdc-65928bd58204.png)

詳細が表示され、Capabilitiesも表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/6e263401-4d9a-9526-edc0-acddfd94e8bf.png)

# おわりに
デフォルト設定でProjectを作成するとRedshiftのクエリエディタが操作できなかったので、「どうやってRedshiftのクエリエディタからクエリするんだ？」と疑問を持ったのがCapability理解の始まりでした。
現時点でのCapabilityは6種類だけだったり、DWHではRedshiftしか扱えなかったりしていますが、今後どんどん拡張されていくことでしょう。このレベルで抽象化されていることで、そのあたりもどんどんupdateできるので上手いこと作ってあるなと感じました。