Snowflake Data Clean Rooms: プロバイダーとして分析を実行する

このトピックでは、プロバイダーがクリーンルームを作成して共有し、コンシューマーがデータをリンクした後にクリーンルームで分析を実行する例を示します。プロバイダーがクリーンルーム内で分析を実行するプロセスは、一般に「プロバイダーデータ分析」と呼ばれます。

重要

コンシューマーがプロバイダーにテンプレート上で分析を実行させた場合、プロバイダーの分析によって消費されたクレジットは、プロバイダーではなくコンシューマーに請求されます。コンシューマーは、プロバイダーが分析を実行することを許可した後、クリーンルームをアンインストールして費用の発生を止めなければなりません。

コンシューマーが、特定の期間内にプロバイダーが消費したクレジット数の推定値を取得したい場合、以下のクエリを実行することができます。 -5 は、プロバイダーによる過去5日間の計算消費量の推定値が返されます。

SELECT * FROM table(samooha_by_snowflake_local_db_dev.public.udtf(-5));
Copy

この例のフローは、プロバイダーが取る行動とコンシューマーが取る行動の間で切り替わります。このフローは次のアクションで構成されています。

  1. プロバイダー:

    a.オーバーレイ研究のためにクリーンルームを作成します。

    b.クリーンルームにデータセットを追加します。

    c.どの列を結合し、分析に使用できるかを管理するポリシーを追加します。

    d.定義済みのオーバーラップ解析テンプレートを有効にします。

    e.クリーンルームをコンシューマーと共有します。

    f.分析ができるようにクリーンルームを構成します。

    g.コンシューマーが分析を実行しないようにクリーンルームを構成します。この例では、コンシューマーはデータプロバイダーとしてのみ機能します。

    h.クリーンルームをインストールしたコンシューマーとオーバーラップ調査を行います。

  2. コンシューマー:

    a.プロバイダーに共有されるクリーンルームをインストールします。

    b.クリーンルームにデータセットを追加します。

    c.データセットにセキュリティポリシーを設定します。

    d.クリーンルームで分析を実行するプロバイダーの能力を承認します。

前提条件

この例を完了するには、2つの別々のSnowflakeアカウントが必要です。プロバイダーのコマンドを実行するために最初のアカウントを使用し、コンシューマーのコマンドを実行するために2番目のアカウントに切り替えます。

プロバイダー

プロバイダーアカウントのSnowflakeワークシートを使用して、このセクションのコマンドを実行します。

環境の設定

開発者APIsを使用する前に、SAMOOHA_APP_ROLEロールを引き受け、APIsの実行に使用するウェアハウスを指定する必要があります。SAMOOHA_APP_ROLEロールを持ってない場合は、アカウント管理者にお問い合わせください。

以下のコマンドを実行して環境を設定します。

USE ROLE samooha_app_role;
USE WAREHOUSE app_wh;
Copy

クリーンルームの作成

クリーンルームの名称を作成します。既存のクリーンルーム名との衝突を避けるため、新しいクリーンルーム名を入力してください。クリーンルームの名前に使用できるのは 英数字 のみです。クリーンルーム名には、スペースとアンダースコア以外の特殊文字は使用できません。

まず、以下のコマンドを実行し、各クリーンルームのクリーンルーム名を設定します。

SET cleanroom_name = 'Provider Run Analysis Overlap';
Copy

指定された名前のクリーンルームがすでに存在する場合、この処理は失敗します。

この手順には少し時間がかかりますが、通常は30秒程度です。

provider.cleanroom_init の2番目の引数は、クリーンルームのディストリビューションです。これはINTERNALまたはEXTERNALのいずれかです。テスト目的で、同じ組織内のアカウントにクリーンルームを共有する場合、 INTERNAL を使用して、アプリケーションパッケージがコラボレーターにリリースされる前に実施されなければならない自動セキュリティスキャンをバイパスすることができます。ただし、このクリーンルームを別の組織のアカウントと共有する場合は、EXTERNALクリーンルーム配布を使用する必要があります。

CALL samooha_by_snowflake_local_db.provider.cleanroom_init($cleanroom_name, 'INTERNAL');
Copy

セキュリティスキャンのステータスを表示するには、以下のコマンドを実行します。

CALL samooha_by_snowflake_local_db.provider.view_cleanroom_scan_status($cleanroom_name);
Copy

クリーンルームを作成したら、コラボレーターと共有する前にリリースディレクティブを設定する必要があります。しかし、ディストリビューションがEXTERNALに設定されている場合は、リリースディレクティブを設定する前に、まずセキュリティスキャンが完了するのを待つ必要があります。残りのステップの実行を続け、スキャンが実行されている間、 provider.create_cleanroom_listing ステップの前にここに戻ることができます。

リリースディレクティブを設定するには、以下を実行します。

CALL samooha_by_snowflake_local_db.provider.set_default_release_directive($cleanroom_name, 'V1_0', '0');
Copy

データセットの結合ポリシーを設定する

結合ポリシーとして使用する列を決定するには、データセットを見てPII列を決定します。例えば、あるテーブルの上から10行を見るには、以下のクエリを実行します。

SELECT * FROM SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS LIMIT 10;
Copy

次に、クリーンルーム内でテンプレートを実行する際に、コンシューマーが結合できる列を指定します。このプロシージャはemailのようなID列に対して呼び出される必要があります。結合ポリシーを2回目に設定すると、前に設定した参加ポリシーは新しいものに完全に置き換えられます。

CALL samooha_by_snowflake_local_db.provider.set_join_policy($cleanroom_name, ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:HEM']);
Copy

クリーンルームに追加された結合ポリシーを表示したい場合は、次のコマンドを実行します。

CALL samooha_by_snowflake_local_db.provider.view_join_policy($cleanroom_name);
Copy

クリーンルームに分析テンプレートを追加する

テンプレートは、クリーンルームで実施できる分析の種類を決定します。この例では、プロバイダーのデータセットとコンシューマーのデータセットの重なりについてコラボレーターが分析を実行できるように、定義済みのテンプレートを使用しています。

このテンプレートは、差分プライバシーによって提供される追加のセキュリティ保証をネイティブに実装していることに注意してください。

CALL samooha_by_snowflake_local_db.provider.add_templates($cleanroom_name, ['prod_overlap_analysis']);
Copy

各テーブルに列ポリシーを設定する

テーブルに列ポリシーを設定する前に、テーブルの列を表示するクエリを実行します。例えば、上位10行を表示するには、以下のコマンドを実行します。

SELECT * FROM SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS LIMIT 10;
Copy

テーブルとテンプレートの組み合わせごとに、アナリストが分析で使用できる列、例えばグループ化や集計が可能な列を設定します。これにより、同じテーブルでも基本テンプレートによって異なる列選択ができる柔軟性が生まれます。テーブルに列ポリシーを設定するのは、テンプレートを追加してからにする必要があります。

列ポリシーは 置換のみ であることに注意してください。したがって、この関数が再度呼び出された場合、以前に設定された列ポリシーは新しいものに完全に置き換えられます。

列ポリシーは、メールアドレス、 HEM、 RampID のようなID列では使用しないでください。これは、アナリストがこれらの列でグループ化できないようにするためです。実稼働環境では、SnowflakeはPII列を推測し、この操作をブロックしますが、サンドボックス環境でこの推測は利用できません。これは、アナリストが集計してグループ化できるようにしたい列、例えば、ステータス、年齢層、リージョンコード、稼働日数にのみ使用しなければなりません。

テンプレートとテーブルの組み合わせに対して列ポリシーを設定するには、以下のコマンドを実行します。

CALL samooha_by_snowflake_local_db.provider.set_column_policy($cleanroom_name, [
'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:STATUS', 
'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:AGE_BAND', 
'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:DAYS_ACTIVE', 
'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:REGION_CODE']);
Copy

クリーンルームに追加された列ポリシーを表示したい場合は、次のコマンドを実行します。

call samooha_by_snowflake_local_db.provider.view_column_policy($cleanroom_name);
Copy

コンシューマーと共有する

最後に、以下のようにSnowflakeアカウントロケータとアカウント名を追加して、データコンシューマーをクリーンルームに追加します。Snowflakeアカウント名は<ORGANIZATION>.<ACCOUNT_NAME>の形式である必要があります。

注釈

以下のコマンドを実行する前に、 provider.set_default_release_directive を使用してリリースディレクティブを設定していることを確認してください。以下のコマンドを実行すれば、利用可能な最新バージョンとパッチを確認できます。

SHOW VERSIONS IN APPLICATION PACKAGE samooha_cleanroom_Provider_Run_Analysis_Overlap;
Copy

クリーンルームをコンシューマーと共有するには、以下のコマンドを実行します。

CALL samooha_by_snowflake_local_db.provider.add_consumers($cleanroom_name, '<CONSUMER_ACCOUNT_LOCATOR>', '<CONSUMER_ACCOUNT_NAME>');
CALL samooha_By_snowflake_local_db.provider.create_cleanroom_listing($cleanroom_name, '<CONSUMER_ACCOUNT_NAME>');
Copy

複数のコンシューマーアカウントロケーターを、カンマ区切りの文字列として provider.add_consumers 関数に渡すことも、 provider.add_consumers を個別に呼び出すこともできます。

クリーンルームに追加されたコンシューマーを表示したい場合は、以下のコマンドを実行します。

CALL samooha_by_snowflake_local_db.provider.view_consumers($cleanroom_name);
Copy

分析を実行できる人の設定

注釈

このセクションの APIs は、クリーンルームをコンシューマーと共有した 、コンシューマーがインストールする に使用する必要があります。コンシューマーがクリーンルームをインストールした後にクリーンルームの設定を変更した場合、コンシューマーはクリーンルームをインストールし直す必要があります。

この例では、クリーンルームを構成し、プロバイダーが分析を実行できるようにクリーンルームを構成しますが、コンシューマーは分析を実行できないようにします。つまり、コンシューマーはデータセットの追加とセキュリティポリシーの設定しかできません。

プロバイダーが分析を実行できるようにクリーンルームを設定するには、以下のコマンドを実行します。

CALL samooha_by_snowflake_local_db.provider.enable_provider_run_analysis($cleanroom_name, ['<CONSUMER_ACCOUNT_LOCATOR>']);
Copy

注釈

この例では使用されませんが、プロバイダーは、 provider.disable_provider_run_analysis コマンドを実行することによって、設定を逆にして、プロバイダー自身が分析を実行しないようにすることができます。

デフォルトでは、コンシューマーはクリーンルームで分析を行うことができます。コンシューマーが分析を実行しないようにクリーンルームを構成するには、以下のコマンドを実行します。

CAll samooha_by_snowflake_local_db.provider.disable_consumer_run_analysis($cleanroom_name, ['<CONSUMER_ACCOUNT_LOCATOR>']);
Copy

注釈

この例では使用されませんが、プロバイダーは、 provider.enable_consumer_run_analysis コマンドを実行することによって、コンシューマが分析を実行できるように、構成を逆にすることができます。

コンシューマー

あなたは今、クリーンルームのコンシューマーとして行動するように切り替えています。コンシューマーアカウントのSnowflakeワークシートを使用して、このセクションのコマンドを実行します。

環境の設定

開発者APIsを使用する前に、SAMOOHA_APP_ROLEロールを引き受け、APIsの実行に使用するウェアハウスを指定する必要があります。SAMOOHA_APP_ROLEロールを持ってない場合は、アカウント管理者にお問い合わせください。

以下のコマンドを実行して環境を設定します。

USE ROLE samooha_app_role;
USE WAREHOUSE app_wh;
Copy

クリーンルームをインストールする

プロバイダーから共有されたクリーンルームをインストールする前に、クリーンルームの名前を決めます。

SET cleanroom_name = 'Provider Run Analysis Overlap';
Copy

以下のコマンドは、コンシューマーアカウントにクリーンルームをインストールします。

CALL samooha_by_snowflake_local_db.consumer.install_cleanroom($cleanroom_name, '<PROVIDER_ACCOUNT_LOCATOR>');
Copy

データセットのリンク

これで、データセットのいくつかをクリーンルームにリンクして、データプロバイダーのデータを使ってセキュアな計算を実行することができます。プロバイダーはクリーンルームで分析を行う際にこのデータを使用します。

CALL samooha_by_snowflake_local_db.consumer.link_datasets($cleanroom_name, ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS']);
Copy

注釈

テーブルが存在するにもかかわらず、この手順がうまくいかない場合は、テーブルを含むデータベースが登録されていない可能性があります。データベースを登録するには、ACCOUNTADMINロールを持つユーザーとして以下のコマンドを実行します。

USE ROLE accountadmin;
CALL samooha_by_snowflake_local_db.provider.register_db('<DATABASE_NAME>');
USE ROLE samooha_app_role;
Copy

クリーンルームに追加したデータセットを表示したい場合は、以下のプロシージャを呼び出します。

CALL samooha_by_snowflake_local_db.consumer.view_consumer_datasets($cleanroom_name);
Copy

データセットの安全な結合ポリシーを設定する

このセクションでは、クリーンルームで分析を実行する際に、プロバイダーが結合を許可される列を指定します。メールアドレスなどのID列に対して以下のコマンドを実行します。結合ポリシーは「置換のみ」であるため、この関数が再度呼び出されると、以前に設定された結合ポリシーは新しいものに完全に置き換えられます。

CALL samooha_by_snowflake_local_db.consumer.set_join_policy($cleanroom_name, ['SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:HEM']);
Copy

データセットの列ポリシーを設定する

テーブルとテンプレートの組み合わせごとに、プロバイダーが分析で使用できる列、例えばグループ化や集計が可能な列を設定します。これにより、同じテーブルでも基本テンプレートによって異なる列選択ができる柔軟性が生まれます。テーブルに列ポリシーを設定するのは、テンプレートを追加してからにする必要があります。

列ポリシーは 置換のみ であることに注意してください。したがって、この関数が再度呼び出された場合、以前に設定された列ポリシーは新しいものに完全に置き換えられます。

列ポリシーは、メールアドレス、 HEM、 RampID のようなID列では使用しないでください。これは、プロバイダーがこれらの列でグループ化できないようにするためです。実稼働環境では、SnowflakeはPII列を推測し、この操作をブロックしますが、サンドボックス環境でこの推測は利用できません。これは、プロバイダーが集計してグループ化できるようにしたい列、例えば、ステータス、年齢層、リージョンコード、稼働日数にのみ使用しなければなりません。

テンプレートとテーブルの組み合わせに対して列ポリシーを設定するには、以下のコマンドを実行します。

CALL samooha_by_snowflake_local_db.consumer.set_column_policy($cleanroom_name, [
    'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:STATUS', 
    'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:AGE_BAND', 
    'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:DAYS_ACTIVE', 
    'prod_overlap_analysis:SAMOOHA_SAMPLE_DATABASE.DEMO.CUSTOMERS:REGION_CODE'
]);
Copy

プロバイダーが分析を実行できるようにする

コンシューマーは、プロバイダーがテンプレートごとに分析を実行することを明示的に承認する必要があります。この承認がなければ、たとえクリーンルームを設定したとしても、プロバイダーは分析を実行できません。

まず、プロバイダーがクリーンルームを設定し、分析を実行できるかどうかを確認することができます。

CALL samooha_by_snowflake_local_db.library.is_provider_run_enabled($cleanroom_name)
Copy

次に、以下のコマンドを実行して、プロバイダーが分析を実行できるようにします。プロバイダーが使用できるようにしたいテンプレートごとにコマンドを実行する必要があります。プロバイダーが保護されていないデータで分析を実行するのを防ぐために、結合と列のポリシーを設定した に承認する必要があります。

CALL samooha_by_snowflake_local_db.consumer.enable_templates_for_provider_run($cleanroom_name, ['prod_overlap_analysis']);
Copy

プロバイダー

クリーンルームで分析を実行するために、プロバイダーアカウントに切り替えます。プロバイダーアカウントのSnowflakeワークシートを使用して、このセクションのコマンドを実行します。

コンシューマーからの情報へのアクセス

プロバイダーがコンシューマーアカウントのデータを処理する際に分析を実行します。分析結果を取得するために、プロバイダーはコンシューマーからプロバイダーに戻ってくる情報にアクセスする必要があります。次のコマンドを実行して、コンシューマーから発信された情報にアクセスします。

CALL samooha_by_snowflake_local_db.provider.mount_request_logs_for_all_consumers($cleanroom_name);
Copy

分析を実行する

プロバイダーは、分析を実行したいときに provider.submit_analysis_request コマンドを実行します。

CALL samooha_by_snowflake_local_db.provider.submit_analysis_request(
    $cleanroom_name, 
    '<CONSUMER_ACCOUNT>',
    'prod_overlap_analysis', 
    ['SAMOOHA_SAMPLE_DATABASE.demo.customers'], 
    ['SAMOOHA_SAMPLE_DATABASE.demo.customers'], 
    object_construct(       
      'dimensions', ['c.REGION_CODE'],        
      'measure_type', ['AVG'],           
      'measure_column', ['c.DAYS_ACTIVE'],
      'where_clause', 'p.hem=c.hem'                                         
    ));
Copy

provider.submit_analysis_request コマンドは、リクエスト識別子を返します。分析リクエストのステータスを確認し、分析結果を取得できるように、 この識別子を保存する必要があります。例えば、識別子をローカル変数に保存するには、以下のように実行します。

SET request_id = '<REQUEST_ID>';
Copy

分析実行のリクエストを送信した後、以下のコマンドを実行することで、リクエストのステータスを見ることができます。初めてコマンドを実行する際には、遅延が発生する可能性があることに注意してください。

CALL samooha_by_snowflake_local_db.provider.check_analysis_status(
    $cleanroom_name, 
    $request_id, 
    '<CONSUMER_ACCOUNT_LOCATOR>'
);
Copy

注釈

この API が失敗した場合、クリーンルームをコンシューマーとしてインストールする に、プロバイダーが分析を実行できるようにクリーンルームを構成したことを確認してください。コンシューマーがクリーンルームをインストールした後にクリーンルームが設定された場合、コンシューマーはクリーンルームをインストールし直さなければなりません。

provider.check_analysis_status コマンドが返すステータスが COMPLETED の場合、以下のコマンドを実行することで、分析結果を取得することができます。

CALL samooha_by_snowflake_local_db.provider.get_analysis_result(
    $cleanroom_name, 
    $request_id, 
    '<CONSUMER_ACCOUNT_LOCATOR>'
);
Copy