Snowflakeでリーダーアカウントを作成して挙動を確かめてみた
さがらです。
Snowflakeでは「リーダーアカウント」というアカウントを用いることで、Snowflakeアカウントを持っていないユーザーに対してデータを共有することが出来ます。
DevelopersIOでもすでにこちらのブログはあるのですが、SnowflakeのUIがSnowsightに変更になっていることもあるため、改めて挙動を確認してみます。
事前準備
まず、リーダーアカウントに共有するためのデータベース・スキーマ・テーブルを用意しておきます。
今回は事前に下図のようなデータベース・スキーマ・テーブルを作成しておきました。
SHAREオブジェクトを作成し、リーダーアカウントに共有するデータの権限を付与
リーダーアカウントに対してデータを共有するには、SHAREオブジェクトを作成し、そのSHAREオブジェクトに対して権限を付与する必要があります。
今回は下記のクエリを実行しました。
-- accountadminで行う
use role accountadmin;
-- shareの作成
create share sagara_share_test;
-- shareに閲覧権限を付与
grant usage on database sagara_rawdata_db to share sagara_share_test;
grant usage on schema sagara_rawdata_db.citibike to share sagara_share_test;
grant select on all tables in schema sagara_rawdata_db.citibike to share sagara_share_test;
リーダーアカウントの作成し、SHAREの権限を付与
次にリーダーアカウントの作成をします。下記のクエリを実行します。
use role accountadmin;
create managed account sagara_reader_account
admin_name = sagara_reader.
admin_password = '任意のパスワード',
type = reader;
このクエリを実行すると、下図のようにアカウント名やログイン用のURLが表示されますのでメモしておきます。
次に、下記のクエリを実行して先ほど作成したshareをこのリーダーアカウントが利用できるようにします。add accounts =
の後には、先程作成したリーダーアカウントの情報の内、accountLocator
を指定することにご注意ください。
-- shareにアカウントを追加
alter share sagara_share_test add accounts = リーダーアカウントのaccountLocator;
この後下記のクエリを実行して、kind
がOUTBOUND
のレコードが確認できればOKです。
-- 適切に権限付与できたか確認
show shares;
リーダーアカウントにログインし、SHAREからデータベースを作成
先ほどリーダーアカウント作成時に確認したURLを用いて、リーダーアカウントにログインしてみます。
ログインすると、通常のSnowsightと同じような画面となっています。
次にワークシートを作成し、下記のクエリを実行してshareからデータベースを作成します。このときの注意点として、shareを指定する際はshow shares
コマンドで確認できるowner_account.name
の形にします。
-- accountadminで行う
use role accountadmin;
-- owner_accountとnameを確認
show shares;
-- shareからデータベース作成
create database sagara_share_db from share owner_accountの値.nameの値;
この後、下図のようにACCOUNTADMINロールから見てデータベースが作成されていればOKです。
リーダーアカウント内で別のユーザーに閲覧権限を付与
これまでの工程でリーダーアカウント内でshareからデータベースを作成できましたが、このままでは別のユーザーの方がクエリを実行できないため、そのための準備を行います。
通常のSnowflakeと同じような形で、ウェアハウス・ロール・ユーザーを作成していきます。
-- リーダーアカウントでクエリを実行するロール「vistor_role」を作成
use role securityadmin;
create role visitor_role;
grant role visitor_role to role sysadmin;
-- 「vistor_role」がshareから作られたデータベースにクエリを実行できるように
use role accountadmin;
grant imported privileges on database sagara_share_db to role visitor_role;
-- ウェアハウスの作成
use role sysadmin;
create or replace warehouse visitor_wh with
warehouse_size = 'XSMALL'
warehouse_type = 'STANDARD'
auto_suspend = 60
auto_resume = true
min_cluster_count = 1
max_cluster_count = 1
scaling_policy = 'STANDARD'
initially_suspended = TRUE;
grant usage on warehouse visitor_wh to role visitor_role;
-- ユーザー作成
use role securityadmin;
create user sagara_visitor password ='任意のパスワード' email='任意のメールアドレス' default_role = visitor_role must_change_password = TRUE;
grant role visitor_role to user sagara_visitor;
-------------
-- オプション:リーダーアカウント内でshareされたデータから自由にテーブルを作ることができるようにオブジェクト作成と権限付与
-------------
-- visitorの人が自由にテーブルを作成できるデータベース・スキーマを作成
use role sysadmin;
create database visitor_db;
grant usage on database visitor_db to role visitor_role;
use database visitor_db;
create schema visitor_schema;
grant usage, create table, create view on schema visitor_schema to role visitor_role;
作成したユーザーで動作確認
先ほど作成したリーダーアカウント内でクエリするためのユーザーでログインして、shareされたデータに対してクエリを発行してみます。
まず、シンプルにshareから作られたデータベース内のテーブルに対してクエリを発行してみます。
use role visitor_role;
use database sagara_share_db;
use schema citibike;
use warehouse visitor_wh;
select * from weather;
次に、オプションで作成したvisitor_db
のvisitor_schema
内に、新しいviewを作成してみます。権限を付与すれば、リーダーアカウントでもshareされたデータから自由にデータマート的なテーブル・ビューを作ることができます。
create view visitor_db.visitor_schema.weather_view as
select * from sagara_share_db.citibike.weather limit 10;
select * from visitor_db.visitor_schema.weather_view;
注意事項:リーダーアカウント内では新しいデータのアップロードや既存のデータの変更などができません
ドキュメントにもある通り、リーダーアカウント内では下記のコマンドが実行できません。この仕様だけご注意ください。
- INSERT
- UPDATE
- DELETE
- MERGE
- COPY INTO <テーブル>
- CREATE MASKING POLICY
- CREATE PIPE
- CREATE ROW ACCESS POLICY
- CREATE SHARE
- CREATE STAGE
- SHOW PROCEDURES
最後に
Snowflakeでリーダーアカウントを作成して挙動を確かめてみました。
リーダーアカウントでは新しいデータの追加などは出来ないのですが、shareされたデータを元にデータマート的なテーブル・ビューを作ることが出来てダウンロードも行えるので、「外部へのデータの閲覧・ダウンロード機能の提供」が目的であればリーダーアカウントはとても便利だと思います!