認証タイプを「ユーザーにメッセージを表示」としてパブリッシュした Snowflake データソースを異なるユーザーで表示できない #Tableau
Tableau Cloud に Snowflake のデータを認証タイプとして「ユーザーにメッセージを表示」としてパブリッシュした際に、パブリッシュしたユーザーと異なるユーザーから対象のデータソースやワークブックを表示できない場面があったので対処方法を記事にしました。
前提条件
- Tableau Desktop
- 2023.3
- Tableau Cloud
- Snowflake への認証
- 基本認証(ユーザー名とパスワード)
- ※2023/12/14 時点の内容です
結論
先に結論ですが、データソース(Snowflake)への接続時に、ロールを指定していたことが原因でした。
Tableau Desktop(または Tableau Cloud) から Snowflake への接続時の項目としてロールの指定が可能です。
この状態で、データソースの認証タイプを「ユーザーにメッセージを表示」としてパブリッシュした場合、Tableau 上のユーザーがデータにアクセスするには、自分の Snowflake 上の認証情報を入力する必要があります。
この際、認証に使用する Snowflake ユーザーが、接続時に指定したロールを割り当てられていない場合、データを表示することができません。
対処方法として、はじめにデータソースに接続する際のロール(上図の [役割])はオプション項目なので、ここを空欄のまま接続しデータソースやワークブックをパブリッシュすれば問題ないです。
背景
こちらの経緯ですが、Tableau から Snowflake のデータを参照する際に、ユーザーごとに表示されるレコードを制御したかったというのがあります。
データをパブリッシュする際の認証タイプのオプションとして「埋め込みパスワード」も利用可能ですが、この場合、以下の通りすべてのユーザーで共通するユーザー名・ロールが使用されます。
接続に使用した認証資格情報は接続とともに保存され、自分がパブリッシュするデータ ソースやワークブックにアクセスするすべてのユーザーによって使用されます。
ビューやマスキングポリシー・行アクセスポリシーなど Snowflake 側でユーザーごとに表示される内容を動的に制御したい場合、Tableau からの各閲覧ユーザーは自分の認証情報で Snowflake にログインする必要があります。そのためには、データソースへの認証タイプを「ユーザーにメッセージを表示」に設定します。
検証
ビューの作成
Tableau から参照する用のビューを Snowflake 作成します。
ここでは、CURRENT_USER()、CURRENT_ROLE() 関数を使用し、ユーザーごとに表示される内容を変えるためにビューとして作成しています。
あわせて後述の手順でユーザーが使用するウェアハウスを作成しています。
USE ROLE SYSADMIN; --ウェアハウスの作成 CREATE WAREHOUSE TAB_WH WAREHOUSE_SIZE = xsmall WAREHOUSE_TYPE = standard AUTO_SUSPEND = 60 AUTO_RESUME = True INITIALLY_SUSPENDED = True; --SYSADMIN で作成 CREATE OR REPLACE DATABASE TABLEAU_TEST; CREATE OR REPLACE VIEWS TABLEAU_TEST.PUBLIC.USERINFO as SELECT CURRENT_USER() as SNOWFLAKE_USER_NAME ,CURRENT_ROLE() as SNOWFLAKE_CURRENT_ROLE ;
ロールを指定して接続
Tableau Desktop からこのビューを参照してみます。はじめに、役割(Role)としてSYSADMIN
を指定し接続します。また、このユーザーのデフォルトロールはACCOUNTADMIN
となっています。
以下の設定でテーブルに接続します。
ここでの注意点として、オプションとしてウェアハウスを指定することが可能です。
ウェアハウスを選択しない場合、ユーザーごとにデフォルトの Snowflake ウェアハウスが使用されます。
まずは、COPUTE_WH
というウェアハウスを指定してみます。
この状態で適当なワークシートを作成し、Tableau Cloud にパブリッシュします。
データソースの認証方式として「ユーザーにメッセージを表示」を選択します。
パブリッシュ後、Tableau Cloud からワークシートを開きます。
データソースの認証方式として「ユーザーにメッセージを表示」を選択したので、以下の画面が表示されます。
※Tableau Server という表示になっていますが、Tableau Cloud からの接続です。
Snowflake でテーブルを作成したユーザーの情報でログインすると、以下の通り、内容を確認できます。
この時のロールは、Tableau から Snowflake への接続設定時に指定したロール(SYSADMIN
)となります。
Tableau からの参照用ユーザーを作成する
Snowflake で以下のコマンドを実行し、Tableau からの参照用のユーザー(TABLEAU_USER1
)とロールを作成します。
あわせてユーザーのデフォルトウェアハウスに、はじめに作成した Tableau からの参照用のウェアハウスを指定します。
--Role と User を追加 USE ROLE USERADMIN; CREATE ROLE TABLEAU_ROLE; CREATE USER TABLEAU_USER1 PASSWORD='パスワード' DEFAULT_ROLE = TABLEAU_ROLE ; USE ROLE SECURITYADMIN; GRANT ROLE TABLEAU_ROLE TO USER TABLEAU_USER1; GRANT USAGE ON DATABASE TABLEAU_TEST TO ROLE TABLEAU_ROLE; GRANT USAGE ON SCHEMA TABLEAU_TEST.PUBLIC TO ROLE TABLEAU_ROLE; GRANT SELECT ON ALL VIEWS IN SCHEMA TABLEAU_TEST.PUBLIC TO ROLE TABLEAU_ROLE; ALTER USER TABLEAU_USER1 SET DEFAULT_WAREHOUSE = TAB_WH;
この状態で、Tableau Cloud から同じワークブックを開きます。今度は、Tableau からの参照用ユーザーを指定します。
この場合、画面が遷移せず、再度プロンプトが表示され、データを確認することができません。
※このユーザーには、はじめに接続時に指定したSYSADMIN
が割り当てられていないため。
ロールを指定・ウェアハウスを未指定で接続
次に、再度 Tableau Desktop から以下の設定でワークシートをパブリッシュします。
- ロールを指定(
SYSADMIN
) ※上記の手順と同様 - ウェアハウスは未指定
この場合も、Tableau からの参照用ユーザーで、Tableau からサインインしても同様に画面が遷移せずデータを確認することができません。
ロール・ウェアハウスを未指定で接続
さいごに、ロールの指定もなくして接続します。
※ここで接続に使用しているのは、Tableau からの参照用ユーザーではありません。
この状態でデータを確認すると、ロールがこれまでのSYSADMIN
ではなく、ユーザーのデフォルトロールであるACCOUNTADMIN
が使用されていることが確認できます。
この接続設定でパブリッシュします。
この状態であれば、Tableau からの参照用ユーザーからもデータを確認できます。
この時のロールは、そのユーザーのデフォルトロールが使用されます。ウェアハウスについても、未指定なので、このユーザーのデフォルトウェアハウスが使用されます。
ロール未指定・ウェアハウス指定の場合
ロールを未指定で、ウェアハウスを指定した場合、Snowflake へのログインに使用するユーザーに、対象のウェアハウスの使用権限がないとエラーとなります。
さいごに
Tableau Cloud にパブリッシュされた Snowflake データソースへの異なるユーザー・ロールでの接続時の注意点について記載しました。
こちらの内容が何かの参考になれば幸いです。