AWS Clean Roomsを試してみた

# 背景・目的
しばらく前ですが、[AWS Clean Roomsが一般提供](https://aws.amazon.com/jp/about-aws/whats-new/2023/03/aws-clean-rooms-generally-available/)となりました。
以前から気になっていたので、基本の整理と試してみました。

# まとめ
- Clean Roomsは、互いのアカウントデータを明らかにすることなく、新しいインサイトを得ることが出来る。
- 参加者の選定、データを移動せずに共有させる。
- SQLクエリや出力を制限する分析ルールや暗号が備わっている。
- 料金は、CRPUという単位で最低1分単位で課金される。

# 概要
AWSドキュメントの[AWS Clean Rooms の概要](https://docs.aws.amazon.com/ja_jp/clean-rooms/latest/userguide/what-is.html)をもとに整理します。

>AWS Clean Rooms基盤となるデータを互いに明らかにすることなく、パートナーと共同で新しい洞察を得ることができます。を使用するとAWS Clean Rooms、数分で独自のクリーンルームを作成でき、ほんの数ステップで集合データセットの分析を開始できます。コラボレーションするパートナーを選択したり、パートナーのデータセットを選択したり、参加者に制限を設定したりできます。

>AWS Clean Roomsを使用すると、AWSをすでに使用している何千もの企業とコラボレーションできます。コラボレーションでは、AWSデータを別のプラットフォームから移動したり、別のプラットフォームに読み込んだりする必要はありません。クエリを実行すると、AWS Clean Rooms元の場所からデータを読み取り、組み込みの分析ルールを適用して、データを管理しやすくなります。

>AWS Clean Roomsには、設定可能なデータアクセス制御と監査サポート制御が組み込まれています。これらのコントロールには以下が含まれます。
> ・ SQL クエリを制限し、出力制限を設ける分析ルール
・Clean Rooms厳しいデータ処理ポリシーに準拠するために、クエリが処理されている間もデータを暗号化しておくための暗号コンピューティング
・クエリを確認して監査に役立つクエリログ

まとめると、下記の特徴があるようです。

- データを互いに明らかにせずに、パートナーと共同（共有）できる。
- パートナーの選択、及びパートナーのデータセットを選択、参加者の制限が可能
- データの移動することなく、共有することが可能。
- アクセス制御と監査制御が可能。
- SQLクエリや出力を制限する分析ルール
- 暗号化

## AWS Clean Roomsのコンセプト
### コラボレーション
|概念 |定義 |
|:--|:--|
|コラボレーション|・メンバーが構成されたテーブルに対して SQL クエリを実行できる、AWS Clean Room の安全な論理境界。<BR>・コラボレーションはコラボレーション作成者によって作成されます。<BR>・コラボレーションに招待されたメンバーのみがコラボレーションに参加できます。<BR>・コラボレーションには、データをクエリして結果を受け取ることができるメンバーは 1 人だけです。<BR>・すべてのメンバーは、コラボレーションに参加する前に、コラボレーションに招待された参加者のリストを見ることができます。|

### メンバー
|概念 |定義 |
|:--|:--|
|メンバー|・コラボレーションに参加している AWS の顧客。<BR>・メンバーは AWS アカウントを使用して識別されます。<BR>・すべてのメンバーがデータを投稿できます。|
| メンバーシップ|・メンバーがコラボレーションに参加すると作成されるリソース。<BR>・メンバーがコラボレーションに関連付けるすべてのリソースは、メンバーシップの一部であるか、メンバーシップに関連付けられています。<BR>・メンバーシップを所有するメンバーのみが、そのメンバーシップ内のリソースを追加、削除、または編集できます。|
|コラボレーションクリエーター|・コラボレーションを作成するメンバー。<BR>・コラボレーション作成者は 1 つのコラボレーションにつき 1 人だけです。<BR>・コラボレーションからメンバーを削除したり、コラボレーションを削除したりできるのは、コラボレーションの作成者だけです。|
|クエリできるメンバー|・コラボレーション内のデータをクエリできるメンバー。<BR>・コラボレーションごとにクエリを実行して結果を受け取ることができるメンバーは 1 人だけで、そのメンバーは変更できません。<BR>・管理者ユーザーは AWS Identity and Access Management (IAM) 権限を使用して、どのIAMプリンシパル (ユーザーやロールなど) がコラボレーション内のデータをクエリできるかを制御できます。<BR>クエリできるメンバーは、結果を受け取ることができるメンバーと同じでなければなりません。|
|結果を受け取ることが出来るメンバー|・クエリ結果を受け取ることができるメンバー。<BR>・現在、結果を受け取ることができるメンバーは、クエリできるメンバーと同じでなければなりません。|

### 分析ルール
|概念 |定義 |
|:--|:--|
|分析ルール| 特定のタイプのクエリを許可するクエリ制限。<BR>分析ルールには、集約とリストがあります。<BR><BR>分析ルールのタイプによって、設定されたテーブルで実行できる分析の種類が決まります。各タイプには定義済みのクエリ構造があります。クエリコントロールを使用して、テーブル列を構造内でどのように使用できるかを制御します。|
|集約分析ルール|COUNT、SUM、または AVG 関数を使用してオプションのディメンションに沿って分析を集約するクエリを実行できます。これらのクエリでは、行レベルの情報は表示されません。<BR>キャンペーン計画、メディアリーチ、頻度、コンバージョン測定などのユースケースをサポートします。|
|リスト分析ルール|このテーブルとクエリを実行できるメンバーのテーブルとの重複について、行レベルの属性分析を出力するクエリを許可します。<BR>エンリッチメントやオーディエンスの構築や抑制などのユースケースをサポートします。|


- 分析ルールは、各データ所有者が設定したテーブルに設定するプライバシーを強化するコントロール
- 分析ルールは、構成されたテーブルで実行できるクエリのタイプと仕様を決定
- データを保護するには、コラボレーションで有効にするユースケースと制限するクエリを決定
- 分析ルールが設定されていない場合、設定したテーブルをコラボレーションに関連付けることはできますが、クエリはできない。
- 選択した分析ルールのタイプによって、設定されたテーブルで実行できるクエリのタイプが決まる。分析ルールのタイプは下記の2つがある。
    - 集計分析ルール
        - クエリを実行できるコラボレーションメンバーは、集計統計を取得するクエリを実行可能
    - リスト分析ルール
        - クエリを実行できるコラボレーションメンバーは、行レベルのリストを取得するクエリを実行可能
        - クエリを実行できるメンバーは、分析ルールタイプが異なる複数のテーブルに対してクエリを実行することはできない。

### 設定済みテーブル
|概念 |定義 |
|:--|:--|
|設定済みテーブル|設定済みの各テーブルは、AWS Clean Roomsで使用するように設定されている既存のテーブルへの参照を表します。AWS Glue Data Catalog設定されたテーブルには、データの使用方法を決定する分析ルールが含まれています。|
|現在、AWS Glueでカタログ化された Amazon シンプルストレージサービス (Amazon S3) AWS Clean Rooms に保存されているデータの関連付けをサポートしています。|

### 暗号コンピューティング
|概念 |定義 |
|:--|:--|
|暗号化|キーと呼ばれる秘密の値を使用して、データをランダムに見える形式にエンコードするプロセス。キーにアクセスしなければ、元のプレーンテキストを判別することはできません。|
|復号|暗号化されたデータを元の形式に戻すプロセス。復号化は、秘密鍵にアクセスできる場合にのみ実行できます。|
|C3R 暗号化クライアント|The Cryptographic Computing for Clean Rooms(C3R) 。データの暗号化と復号化に使用されるC3Rは、コマンドラインインターフェイスを備えたクライアント側の暗号化SDKです。|
|Fingerprint カラム|JOIN SQL コンストラクト用に暗号化保護されているカラム。|
|Sealed カラム |SELECT SQL コンストラクト用に暗号化保護されているカラム。|
|Cleartext カラム | JOIN または SELECT SQL 構文のどちらに対しても暗号化保護されていないカラム。|

- C3Rにより、組織は機密データをまとめてデータ分析から新しい洞察を引き出すことができると同時に、その過程で学習できる内容を暗号的に制限できる。

## 料金
2023年8月時点の料金について整理しています。最新情報や正確な情報は[こちら](https://aws.amazon.com/jp/clean-rooms/pricing/)のドキュメントをご確認ください。

- Clean Roomでは、Clean Rooms Processing Unit (CRPU) と呼ばれる単位でコンピューティング能力を測定します。
- 実行したCRPU時間単位で1秒ごとに支払われます。（最低料金は60秒）
    - 基本容量は、32CRPU
- AWSの無料利用枠があります。
    - 集約、分析ルールは、最初の12ヶ月の9CRPU時間/月
- 実行したクエリのコンピューティング容量に対してのみ支払いが発生します。
- カスタム分析ルールでは、東京リージョンの場合、CRPU 時間あたり 2.63 ドルです。


# 実践
[AWS Clean Roomsの仕組み](https://docs.aws.amazon.com/ja_jp/clean-rooms/latest/userguide/what-is.html#how-it-works)を元に試してみます。

## 前提
### S3にデータを用意する
下記のようなデータセットをS3バケットに配置します。（事前にS3バケットを作成しています。）
- ID
- 氏名
- 郵便番号
- 住所
- 電話番号
- 性別
- 生年月日

### Glueでテーブルを作成する
1. 上記でアップロードしたデータセットに対応するテーブルを用意します。
ここでは、下記のようなテーブルを作成しました。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e887a42a-56f9-efc5-b486-1b0307902c19.png)

1. 事前にAthenaでクエリが出来ることを確認しておきます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0cc4ba91-c7aa-dd97-f9cb-9b2e6b5ad4e9.png)

## AWS Clean Rooms でのコラボレーションの作成
1. Clean Roomのナビゲーションペインで「コラボレーション」をクリックします。
1. コラボレーション画面で、「コラボレーションを作成」をクリックします。

### 1. コラボレーションを定義する
1. 名前を入力します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d570da92-87d4-9230-c9e4-46c62622acbf.png)


1. 下記を設定します。
    - メンバ1:自分の表示名
    - メンバ2:招待するアカウントIDと表示名
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c3773638-c785-20e5-e8aa-29f76f9af9d5.png)

1. メンバー能力には、クエリを実行して結果を受け取ることが出来るメンバーを選択します。ここでは招待したアカウントを指定します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c4d5e1c8-3eb1-40d7-54fd-34a29dff9291.png)

1. ここでは、クエリログ記録を有効化します。
1. 暗号化コンピューティングを入力し、「次へ」をクリックします。
    - クリアテキスト列を許可
        - Yes：暗号化されたテーブルでは、クリアテキスト列が許可される。特定列に対してSUM、AVGを実行するためには列がクリアテキストである必要がある。
        - No:暗号化されたテーブルではクリアテキスト列は許可されません。すべてのデータは暗号化されて保護されています。
    - 重複を許可
    - 名前の異なる列のJOINを許可
        - 	異なる名前を持つフィンガープリント列の結合するか
    - NULL値を許可
        - NULLがNULLエントリとして表示される

### 2.メンバーシップ
1. 下記を入力し、「次へ」をクリックします。
    - コラボレーションメンバーシップを有効化
    - クエリログ記録を有効化
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/5a7f42ce-4f04-cacf-1bea-02d4d7fd1e8d.png)

1. 確認画面で「コラボレーションとメンバーシップを作成」をクリックします。
1. 2つのメンバーが登録されました。このうち招待したアカウントは招待済みの状態です。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8cf3166d-c976-8899-e454-0b67553a3188.png)


## Invitationを受け入れる
1. 招待されたアカウントにサインインし、Clean Roomsで、コラボレーションをクリックします。
1. 参加可能タブをクリックし、名前をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2ea70f71-c702-9639-793c-10b6e0a3ef25.png)
1. 「メンバーシップを作成」をクリックします。
1. メンバーシップを作成画面で「メンバーシップを作成」をクリックします。
1. ポップアップが表示されます。「メンバーシップを作成」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f3c2390f-bf64-9124-85dd-2e80c173b74e.png)
1. 「アクティブメンバーシップあり」タブにコラボレーションが表示されました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/63bfa839-3cbe-1cd3-90ac-81b6108be373.png)

1. 提供側のアカウントにサインインします。
1. メンバーがActiveになりました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8d8afed9-1584-e8f8-c6cb-9e38035dcd10.png)

## Creating a configured table in AWS Clean Rooms
1. Clean Roomsのナビゲーションペインで、「設定済みのテーブル」をクリックします。
1. 「新しいテーブルを設定」をクリックします。
1. 予め作成したデータベースとテーブルを選択します。またスキーマを表示する場合は、「AWS Glueのスキーマ」を表示を有効にします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/332c2069-9e45-7703-e7e0-27c440667e5c.png)

1. コラボレーションで許可された列で、対象を選択します。ここではid以外を選択してみました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/32cdc75e-d80d-6b5f-3791-23a898a34e94.png)

1. 最後に、「新しいテーブルを設定」をクリックします。
1. 現時点では、分析ルールが設定されていないので、クエリが出来ないようです。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/6f0982d0-1bc8-903f-b52a-23ff2490cd4f.png)


### Configuring an analysis rule to a configured table
分析ルールを定義すると、クエリを実行して結果を受け取ることができるメンバーに、AWS Clean Rooms でサポートされている特定の分析ルールに一致するクエリを実行する権限を与えることが可能。
- AWS Clean Rooms は、次のタイプの分析ルールをサポートしています
    - Aggregation
    - List
    - Custom
- 構成されたテーブルごとに存在できる分析ルールは 1 つだけです。

#### テーブルへの集計分析ルールの構成
1. Clean Roomsの設定済みのテーブルで「分析ルールを設定」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/3376efbf-4318-1dd5-261e-b5e86e8df63c.png)

1. 分析ルールタイプを「集約」、作成方法を「ガイドフロー」を選択し、「次へ」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/4e98b25e-e98a-e1d4-3b0c-87fc4a684cf1.png)

1. 集約関数には、Countを選択し、列を指定します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8e803c85-296a-c9cb-409f-478391cfedc2.png)

1. 結合コントロール、ディメンジョンコントロールやスカラー関数はデフォルトのままとします。
1. 集約制約を設定します。特定されないように最小数を設定できます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ea8c4090-7cc4-6382-2de0-e5990eb4d846.png)

1. 最後に分析ルールを設定をクリックします。

## Associating a configured table to a collaboration
1. Clean　Roomsのナビゲーションペインで「設定済みのテーブル」をクリックし、該当テーブルを選択します。
1. 「コラボレーションに関連付ける」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ca5df44f-f0e3-6ff6-7d55-906ca67a0c83.png)

1. ポップアップされるので、コラボレーションを選択し、「コラボレーションを選ぶ」をクリックします。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/db8ba8fb-ab3c-875b-3a19-affb46444580.png)

1. 下記を設定（デフォルトのまま）、「テーブルを関連付ける」をクリックします。
    - 設定済みのテーブル名
    - テーブルの関連付けの詳細
    - サービスアクセス＞ロールは新規
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/a3b05760-3a15-25f4-de71-ef81f4dccc26.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b43bda56-d634-7752-a64a-2094a980639f.png)


1. 関連付けが完了しました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/24eaeb54-662e-6ee4-32da-4e90e41d704e.png)


## Querying data in a collaboration
1. コラボレーションに参加しているメンバーアカウントにサインインします。
1. Clean Roomsのナビゲーションペインで「コラボレーション」をクリックし、アクティブメンバーシップタブのコロボレーション名をクリックします。
1. 「クエリ」タブをクリックし、テーブルを選択すると、カラムと操作できる権限が表示されます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e38f1869-03d0-b2e5-49c7-16f43b1bc081.png)

1. 分析のアクション＞「結果設定」をクリックします。
1. クエリの結果を保存するS3バケットと、フォーマットを指定し、変更内容を保存します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d2ca32fb-02e4-e47b-8059-6e35f23696c0.png)
1. 下記のクエリを実行してみます。
    ```
    SELECT  COUNT(DISTINCT "customer_list"."address"),
    	COUNT(DISTINCT "customer_list"."name"),
    	COUNT(DISTINCT "customer_list"."phone")
    FROM  "customer_list"
    ```
1. 下記の結果が返されました。実行時間は185秒と10行程度のレコードに対しては、時間がかかりました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/61a49d41-5360-2dec-9379-6438fd7e6595.png)

1. なお、下記のようにルールに設定されていないクエリを実行した場合は、エラーになります。
    ```
    SELECT  address
    FROM  "customer_list"
    ```
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/10e686fa-c3a4-0a6a-f645-1a1d25646812.png)

# 考察
今回は、Clean Roomsを使用して2つのアカウント間でデータ連携をしてみました。
クエリの実行時間が遅かったのがやや気になりましたが、
提供側でルールを設定することで、異なるアカウント間で安全にデータ共有が出来るので有用そうです。
今回は、提供先のジョインや暗号化などは試していませんが、今後試してみたいと思います。

# 参考
https://docs.aws.amazon.com/ja_jp/clean-rooms/latest/userguide/what-is.html

https://aws.amazon.com/jp/clean-rooms/pricing/

https://docs.aws.amazon.com/clean-rooms/latest/userguide/crypto-computing-parameters.html