AWS Clean Roomsの検証

# はじめに
こんにちは。株式会社ジールの@is_zealです。
今回は、2023年3月21日に一般提供が開始された「AWS Clean rooms」を利用してみました。

# AWS Clean Roomsとはどのようなサービスか？
AWS Clean Roomsについて、公式サイトでは以下のように紹介されています。

～以下、公式サイトから抜粋～
AWS Clean Rooms は、企業とそのパートナーが、基になるデータを共有したり公開したりすることなく、集合データセットをより簡単かつ安全に分析し、コラボレーションできるように支援します。AWS Clean Rooms を使用すると、お客様は安全なデータクリーンルームを数分で作成でき、AWS クラウド上の他の企業と協力して、広告キャンペーン、投資決定、研究開発に関する独自のインサイトを得ることができます。

引用：https://aws.amazon.com/jp/clean-rooms/


簡単にまとめると、
「コラボレーションと呼ばれる作業部屋で、各ユーザーが持ち寄ったデータを簡単に共有することができる」サービスです。

これまでは他の人にデータを連携する場合、不要なデータの削除やマスキングなどの作業が必要でしたが、AWS Clean Roomsでは、コラボレーションと呼ばれる作業部屋のようなところに、参照できる箇所等のルールを設定したデータを持ち寄ることで、簡単にデータを共有することができるようになります。

【イメージ図】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/cad248e3-93c7-9446-d8b3-ba1fd9774a7b.png)

**料金**
料金はクエリを実行したアカウントへ、クエリの実行時間に対して課金されます。
参考：https://aws.amazon.com/jp/clean-rooms/pricing/


# AWS Clean Roomsの使い方
今回はAWS Clean Roomsで、S3に格納したcsvファイルのデータをコラボレーションに追加した実際の手順を記載します。

【構成図】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/353b0760-91a1-d1fe-ad0a-a0098637d471.png)

【テーブル情報】
テーブル①「shoocra」：アカウントAが提供
・分析ルール
id：COUNT、結合列
name：dimension
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/a59f764b-05dd-7b37-f5aa-d8bb824eb38d.png)

テーブル②「shoocrb」：アカウントBが提供
・分析ルール
id：COUNT、結合列
name：dimension
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/d3011f4e-f993-7b9d-3136-cfdb461819f5.png)

【AWS Clean Rooms利用手順】
①： コラボレーションを作成する
②： AWS Glueで、S3のバケットに格納したcsvファイルをテーブルとして定義する
③： ②で定義したテーブルをAWS Clean Roomsに設定する
④： ③で定義したテーブルに分析ルールを設定する
⑤： ④で設定したテーブルを、コラボレーションに関連付ける

# ①: コラボレーションを作成する
コラボレーションは、各ユーザーがデータを持ち寄ることができる部屋のようなイメージです。
コラボレーションに招待されたユーザーは、各アカウントで保持しているデータをコラボレーションで共有することができるようになります。
コラボレーションを作成するには、以下の情報が必要になります。

**・コラボレーションの名前**
任意の名前とコラボレーションの説明を入力します。どちらも必須で入力する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/1ce4fedc-6b03-c241-2d41-c7cdb5d0c383.png)

**・メンバー**
コラボレーションに招待するメンバーの表示名と、メンバーのAWSアカウントIDを入力します。
メンバーは1つのコラボレーションに、自分を含めて最大5人までしか追加できません。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/e7f51ccb-d5a6-bfe6-2b3e-33eb25c55931.png)

**・メンバー能力**
コラボレーションでクエリを実行することができるメンバーを指定します。
データは全てのメンバーが共有することができますが、実際にクエリを実行して結果を受け取れるメンバーは1人だけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/3372a63d-afd3-ae0c-1be2-bc19a5524e61.png)

**・クエリログ記録**
実行したクエリのログを受け取るかを設定します。
受け取ることができるログは、自分が実行したクエリのログか自分のデータを含むログのみとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/2f4061e4-71b3-5466-4e49-e3d6a4d1ab9e.png)

**・暗号コンピューティング - 任意**
データの暗号化によって、機密データの共同分析をできるようにするための設定です。
今回は暗号コンピューティングを設定せずにコラボレーションを作成しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/28f3a1c9-c3e5-8762-6091-fda5186b4c7e.png)

**・コラボレーションタグ - 任意**
コラボレーションにタグを設定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/7345e2c1-5a24-9f01-ba08-70ebb507476c.png)

**・コラボレーションメンバーシップ**
コラボレーション作成後、すぐに活動できるメンバーとして参加するかどうかを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/095e6a65-df34-0823-fa8c-23802bf95a8b.png)

**・クエリログ記録**
自分に関連するログを、Amazon CloudWatch Logsにアカウントに保存するかどうかを選択します。
クエリログ記録をオフにした場合、メンバーは自分のアカウントでログを確認する形になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/c475e726-229f-6f20-eda8-fcb0c5460141.png)

**・メンバーシップタグ - 任意**
メンバーシップにタグを設定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/7b7c60b3-1338-c764-dff5-c633d3c63d78.png)

以上の情報を入力し、コラボレーションとメンバーシップの作成は完了です。

コラボレーションを作成後は、新たにメンバーの追加などは行うことができず、コラボレーションの名前のみ編集することができます。

# ②： AWS Glueで、S3のバケットに格納したcsvファイルをテーブルとして定義する

AWS Clean Roomsでは、現時点ではテーブルのデータソースとして、Glueのカタログのみがサポートされています。
そのため、S3のバケットに格納したデータ(csvファイル)をGlueでテーブルとして定義します。
今回は AWS Glue Console の Data Catalog からテーブルを追加する形でテーブルを準備しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/bf06ac20-6120-0c33-aa94-2cb169244c78.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/e0c1db97-3212-7f59-7dd7-1a0a913a9638.png)

# ③： ②で定義したテーブルをAWS Clean Roomsに設定する

定義したテーブルを、AWS Clean Roomsへ設定します。
設定する内容は以下の通りです。

**・設定するテーブルがあるデータベースの指定**
**・設定するテーブルの指定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/adb5c7bc-4ce4-038e-48cc-e99afd4bbaa9.png)
**・コラボレーションで使用できる列の指定**
≪すべての列を許可する場合≫
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/56c0279c-4ed0-051b-12d7-196d4e0b5271.png)
≪一部の列のみを許可する場合(カスタムリスト)：許可する列を指定≫
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/515aad20-437c-bf1a-b06c-63cd2104e22b.png)
**設定するテーブルの表示名**
**タグの指定(任意)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/f862de0f-7a17-311c-4186-1c2ffce4d627.png)

情報の入力後、「新しいテーブルを設定」をクリックすることで、AWS Clean Roomsへのテーブルの設定が完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/e95928b8-36b6-874a-8843-66cfd5ab1a4f.png)

# ④：設定したテーブルに分析ルールを作成する
分析ルールとは、テーブルの各列にどのようなクエリを実行することができるかを決めたルールのことです。
分析ルールには「集計分析」と「リスト分析」の2種類を設定することができます。
「集計分析」：COUNT、SUM、AVGなどの集計関数を使用するクエリを許可します。
「リスト分析」：主にSELECT文の実行のみを許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/50008776-b9eb-57c2-37d4-ce82068603f6.png)
分析ルールは列レベルで定義することができます。
今回は、「id」列にCOUNT関数を使用するクエリを許可するように設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/eea65504-66bc-1437-705c-4e9511b54a13.png)
その他、分析ルールでは以下の項目を設定します。

**・他のテーブルとの結合条件の指定**
結合条件について、以下の項目を設定します。
現時点で、結合は「inner join」のみが可能となっています。

・テーブルへの単独クエリ(他のテーブルと結合していなくてもクエリを実行できるか)の指定
・他のテーブルとの結合時に使用する列の指定
・複数の結合列の照合に使用できる演算子の指定(AND/OR)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/b3232f76-c571-a7bd-d9c3-76a292702c9d.png)

**・ディメンションコントロール**
集計列の基準となる列を指定します。設定は任意です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/15b64e9a-5eff-2441-9c23-612b5e3113ad.png)

**・スカラー関数**
使用できるスカラー関数を指定します。
スカラー関数とは、単一の値を返す関数のことを指します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/0620603d-5ff8-1fe6-2362-f10fd70415e5.png)
カスタムリストを選択すると、スカラー関数の中から指定した関数のみを許可することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/2ebcbd75-6a6c-be2a-e06f-1ca97f6e7c9a.png)

**・クエリ結果のコントロールを指定**
クエリの実行結果の最小数を指定し、その最小数より実行結果の件数が少なければ結果が表示されない、というような設定をすることができます。
今回は「クエリの実行結果が2件より小さい数であれば結果を表示しない」という設定をしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/5f182654-dcd6-033e-a392-1139f298e331.png)
※個別値の最小値は2以上でなければ設定することができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/34b48317-a556-69ef-4651-7a2584bcbfb2.png)

# ⑤： ③で設定したテーブルを、コラボレーションに関連付ける

分析ルールを設定したテーブルを、どのコラボレーションに関連付けるかを設定します。
AWS Clean Rooms>設定済みのテーブル から、設定済みのテーブル名をクリックした後に、右上に「コラボレーションに関連付ける」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/5505fa33-3b7d-9fb2-00f9-c6996b2559c1.png)
コラボレーションを選択して「コラボレーションを選ぶ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/8996a64c-0dce-66bd-56e8-5dc68b5b6fb6.png)
以下の情報を入力し、「テーブルを関連付ける」をクリックします。
・関連付けるテーブル(自動で入力されています)
・メンバーに表示されるデータテーブル名
・テーブルの説明(任意)
・サービスロールの作成/選択
※サービスロールは、関連付けたテーブルに対してクエリを実行するための許可を与えるためのものです。
・タグ(任意)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/8c1a8b35-2407-f5c5-0f87-a8710e732ef6.png)

# 実際にクエリを実行してみた
実際にコラボレーションを作成して、各ユーザーが関連付けたテーブルに対してクエリを実行してみました。

**≪作成したコラボレーションの情報≫**
〇メンバー
・アカウントA（コラボレーションの作成者）
・アカウントB（分析ユーザー、「Shoocrc」テーブルを提供）
・アカウントBのIAMユーザー

**アカウントBでクエリを実行**

**【分析ルールに沿って、テーブル②のIDをCOUNTするクエリを実行】**
  select count(テーブル②.id) 
  from テーブル②
  inner join テーブル①
  on テーブル②.id = テーブル①.id)



【実行結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/f0e5380a-babb-f5fc-4ebc-0d1cb30ddc68.png)
inner joinで同じ分析ルールが設定されている他のテーブルと結合し、結果を表示させることができましたが、クエリを実行してから結果が返ってくるまでに106秒かかってしまいました。

**クエリがエラーになる例**
**【クエリに「*」を使用する】**
分析ルールを列ごとに設定しているため、「*」を使用したクエリを実行するとエラーとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/63013650-51fa-9832-6e48-adf4538a8eee.png)

**【select文以外のクエリを実行】**
クエリとして実行できるのはselect文のみで、DML文などは実行できずエラーとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/6bd47e49-c72e-3c9e-ce88-32dcd3a48388.png)

**【inner join以外の結合でクエリを実行】**
現時点で結合はinner joinのみがサポートされているため、inner join以外で結合させるクエリはエラーとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/19739ad2-b6e0-99ca-18bf-397e8ada57c9.png)

**【分析ルールの違うテーブルを結合させてクエリを実行】**
分析ルールが異なるテーブル同士を結合させるクエリは実行エラーとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/e6ee952e-9b0d-60e5-83c4-12271171854b.png)


**実行ログ**
クエリの実行結果を受け取ることができるのは分析ユーザーのみですが、各メンバーは自分が提供したデータが使用されたことは確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2738007/fe31cb53-1065-2928-0285-c12753edd421.png)

# 感想
AWS Crean Roomsを使用してみて、既存のデータファイルをS3に置いたまま、余計な手間なく他のアカウントと共同で作業ができることに利便性を感じました。
その一方で、シンプルなクエリでも実行時間が長く、利用金額が高くなってしまったり、データソースとして利用できるのがGlueのカテゴリーのみであったりと制約も多いので、今後改善されるとさらに使いやすくなると思います。



# 

株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area