Snowflake Reader Accountの利用方法 ~Snowflake契約がないクライアントとデータを共有する~

Snowflakeアカウントを持たないクライアント(グループ会社や取引先など)とデータを共有するために利用できる、Reader Accountについてまとめました。
2021.11.01

データアナリティクス事業本部コンサルティングチームのnkhrです。

Snowflakeアカウントを持たないクライアント(グループ会社や取引先など)とデータを共有するために利用できる、Reader Accountについてまとめました。本ブログでは、Reader Accountを作成し、データ共有を行うまでの手順を記載しています。

公式サイト:リーダーアカウントの管理

目次

Reader Accountの概要

Reader Accountを利用することで、Snowflakeの新規契約を行わずにデータ共有用の新しいアカウントを作成できます。Reader Accountも通常のアカウントと同様に、デフォルトROLE(ACCOUNTADMINやSYSADMINなど)が提供されます。ただし、通常のアカウントとは違い、アカウント単位で以下の権限が利用不可です。(2021/10時点)

Reader Accountにおいては、ACCOUNTADMINロールを利用しても上記のコマンドは実行できません。Roleやウェアハウスの作成は可能ですが、データのINSERTや、共有されたデータの編集ができないアカウントです。

// Reader Accountで内部ステージの作成(失敗確認)
// 通常の運用ではACCOUNTADMINは利用しない方が良いです。検証のための利用です。
USE ROLE ACCOUNTADMIN;
CREATE TRANSIENT DATABASE IF NOT EXISTS "TEST_DB";
USE DATABASE TEST_DB;           //-- ここまでは実行可能
CREATE  STAGE my_test_stage     //-- CREATE STAGEコマンドはアカウント単位で許可されていないため失敗
COPY_OPTIONS = (ON_ERROR='skip_file');

Reader Account利用時の考慮点

  • Reader AccountのCredit利用費は、アカウント作成元に請求されるため、リソースモニターによる制限を設定したほうが良いと思います。
  • Reader Accountは直接Supportに問い合わせができないため、Provider Account(Reader Accountの作成元)から問い合わせが必要です。
  • Reader Accountはデフォルトで20アカウントまで作成できます(Supportに連絡することで制限緩和できます)。

データ操作権限が必要な別アカウントを作成する場合は、Organization機能が利用できます。Organizationsの概要および開始方法については、下記のブログを参照してください。

Reader Accountの作成

ACCOUNTADMINロールを利用して、Reader Accountします。「CREATE ACCOUNT グローバル権限」を他のROLEに付与することで、ACCOUNTADMIN以外のROLEでReader Accountの作成できます。通常の運用においては、ACCOUNTADMINロール以外に権限を委譲することをお勧めします。

CREATE ACCOUNT権限を別Roleに付与

USE ACCOUNTADMIN;
GRANT CREATE ACCOUNT ON ACCOUNT TO ROLE <your-custome-role-or-other-default-role>;

Reader Accountの作成

USE ROLE ACCOUNTADMIN;     // 通常の運用では、他のROLEに権限移譲したほうが良い
CREATE MANAGED ACCOUNT reader_acct1
  admin_name = "test_reader_admin"
  admin_password = "<reader-account-admin-password>"
  type = reader;

// 作成したアカウントの確認
SHOW MANAGED ACCOUNTS LIKE 'reader_acc1';

Webインタフェースから実行する場合は、[Account] > [Reader Account] > [Create Reader Account]から実行できます。

Reader Accountへログイン

[Account] > [Reader Account]の画面にReader Accountの一覧が表示されるので、「Account URL」カラムに表示されたURLからReader Accountにログインします。URLは20秒程度で作成されますが、実際にログインできるようになるまでに少し時間がかかります(公式ドキュメントでは5分待つように記載があります)。URLアクセス時に「403Forbidden」と表示される場合は、時間をおいてからアクセスするとよいです。

ログイン時に下記画像のように、「データプロバイダー」か「データコンシューマー」を選択画面が表示されます。Reader Accountなのでデータコンシューマになるはずなので、「データコンシューマです」を選択すればよいと思います。公式ドキュメントには、選択の違いについての記載はありませんでした。実際の操作においてもどちらを選択した場合も、ログイン後の画面も違いはなさそうでした。(今後、この表示はなくなるかもしれません)

Reader Accountとのデータ共有設定

Provider Account設定

Provider Account (Reader Accountの作成元アカウント)で共有したい対象を設定します。Webインタフェースの「共有(Shares)」アイコンからGUI操作で設定することもできます。OUTBOUNDがデータ提供元(Provider Account)の共有設定です。

  1. 共有対象のオブジェクトを設定するための空の共有(test_s)を作成
    USE ROLE ACCOUNTADMIN;
    GRANT CREATE SHARE ON ACCOUNT TO SYSADMIN;  // 共有設定の権限をSYSADMINに付与(他のROLEでもよい)
    USE ROLE SYSADMIN;  
    CREATE SHARE test_s;  // 空の共有(share)を作成

  2. 共有したい対象テーブル(table_a)へのSELECT許可を設定

    ※テーブルへの操作権限を許可する場合は、テーブルが所属するSchemaとDatabaseへのUSAGE権限も必要です。

    USE ROLE SYSADMIN; // 手順1で実行権限を付与済み
    GRANT USAGE ON DATABASE a_db TO SHARE test_s;  // DATABASEのUSAGE権限を追加
    GRANT USAGE ON SCHEMA a_db.a_schema TO SHARE test_s;
    GRANT SELECT ON TABLE a_db.a_schema.table_a TO SHARE test_s;
    
    // test_s共有へ付与した権限を表示
    SHOW GRANTS TO SHARE test_s;

  3. 作成したReader Accountへの共有設定

    ALTER SHARE test_s ADD ACCOUNTS=<Reader Account Locator>;
    
    // toカラムに共有先のアカウントLocatorが表示されていることが確認できる
    SHOW SHARES LIKE 'test_s';

  • LocatorはReader Account一覧の「Locator」カラムの値またはコマンドSHOW managed accounts;で確認可能
  • 複数アカウントと共有する場合はカンマ区切りで複数指定する ACCOUNTS= <account1>, <account2>;

Business Criticalのアカウントのデータ共有の場合、デフォルトで共有が制限されている場合があります。Business Criticalでのデータ共有やデータ共有制限の解除については、Data Sharing and Business Critical Accountsを参照してください。

Consumer Account(Reader Account)設定

作成したReader Account(データのコンシューマ)側での設定を記載します。Reader Accountの作成直後はACCOUNTADMIN権限を持つユーザが1つ存在するだけなので、適切なRoleやユーザを作成します。

公式サイト:Reader Accountの設定

  1. Custom Roleの作成

    アカウント作成後は、デフォルトROLE(ACCOUNTADMIN, SECURITYADMIN, SYSADMIN, USERADMIN)が存在します。デフォルトROLE以外のROLEが必要な場合は、CUSTOME ROLEを作成します。

        USE ROLE USERADMIN;  
        CREATE ROLE custome_reader_role;
        GRANT ROLE custome_reader_role TO ROLE sysadmin; // SYSADMINを親Roleに指定

  2. Userの作成

    USE ROLE USERADMIN;
        
    // ログインユーザ名はtest_readerになる
    CREATE USER IF NOT EXISTS test_reader
      DEFAULT_ROLE = custome_reader_role
      TIMEZONE = 'Asia/Tokyo'
      PASSWORD = '<password-of-test_reader>';
        
    GRANT ROLE custome_reader_role TO USER test_reader; //Custom Roleの利用権限を付与
    • CREATAE USEコマンドでLOGIN_NAMEを指定しない場合、ログインユーザ名はユーザ名と同名となります
    • SECURITYADMINロールを持つユーザを最低1名、SYSADMINロールを持つユーザを最低1名作ることが推奨されています
  3. Resource Monitorの作成

    Reader AccountのCredit消費はProvider Accountに請求されるため、Resource MonitorによるCredit消費制限を行うとよいです。

    Resource Monitorコマンド

    CREATE RESOURCE MONITOR reader_accout_monthly_monitor WITH
      CREDIT_QUOTA = 1      // Creadit 1
      FREQUENCY = MONTHLY   //月ごとにCredit消費をクリア
      START_TIMESTAMP = IMMEDIATELY  //作成時からモニタリング開始
      TRIGGERS
        ON 100 PERCENT DO SUSPEND_IMMEDIATE //100%で実行中クエリも即座にすべて停止
        ON 99  PERCENT DO SUSPEND   //99%で実行中クエリは完了を待ち。その他クエリは実行停止
        ON 90  PERCENT DO NOTIFY  //90%で通知(ACCOUNTADMINの通知設定のメールアドレス連絡)
        ON 80  PERCENT DO NOTIFY
        ON 50  PERCENT DO NOTIFY;

    1つのResource Monitorはアカウントレベルで設定できます。(ウェアハウスに紐づけなしでアカウント内のCredit消費をすべてモニターできる)。アカウントレベルで設定する場合はALTER ACCOUNTコマンドを利用します。

    USE ROLE ACCOUNTADMIN;
    ALTER ACCOUNT SET RESOURCE_MONITOR = reader_accout_monthly_monitor;
        
    SHOW RESOURCE MONITORS;    // levelカラムの値が「ACCOUNT」であれば、アカウントレベル設定

  4. Warehouse作成とROLEへの権限付与

    Warehouse作成コマンド

    USE ROLE SYSADMIN;
    CREATE OR REPLACE WAREHOUSE reader_wh WITH
        warehouse_size='XSMALL'
        MAX_CLUSTER_COUNT=1
        AUTO_SUSPEND=180   // 3分間実行がなければWH自動停止
        AUTO_RESUME=TRUE   // TRUEの場合はクエリ実行時に自動でWH起動
        INITIALLY_SUSPENDED=TRUE  // TRUEの場合はWH作成後は停止、FALSEの場合は作成後に起動;
    ;
        
    // WAREHOUSE利用、操作(一時停止や再開など)、利用状況の確認権限を付与、WHの変更は不可
    GRANT USAGE,OPERATE,MONITOR ON WAREHOUSE reader_wh TO ROLE custome_reader_role;

  5. Provider Accountの共有からDB作成

    下記のCREATE DATABASEコマンドを実行することで、共有されているオブジェクトが利用できるようになります。

    // 共有からDatabaseを作成
    CREATE DATABASE shared_db FROM SHARE <Provider Account Locator>.test_s;
        
    // CUSTOM ROLEに共有された権限を付与
    GRANT IMPORTED PRIVILEGES ON DATABASE shared_db TO ROLE custome_reader_role;
        
    // 共有DBへの接続確認
    USE custome_reader_role;  
    USE reader_wh; 
    SELECT * FROM shared_db.test_schema.test_a;

以上でProvider AccountでReader Account(Consumer)を作成し、Reader Accountで共有されたテーブルを確認することができました。

おわりに

今回は、Reader Accountの利用方法について記載しました。Reader AccountやOrganization機能を使うことで、新しい環境の構築とデータ共有がスピーディーにできそうです。