【Snowflake】ロールごとに変化する画面をStreamlit in Snowflakeで作成!!

【Snowflake】ロールごとに変化する画面をStreamlit in Snowflakeで作成!! | Tableau-id Press -タブロイド-
snowflake_logo

こんにちは。t.ozawaです。

今回は、Streamlit in Snowflakeを使って、現在のロール CURRENT_ROLE の種類によって変化する画面を作成していきます。

ロールによって変化する画面を作成することで、上位のロールを持つユーザのみに一部のテーブルを表示し、下位のロールのユーザには何も表示しない、といったセキュリティ重視な画面の構築が可能です。

今回は、「ACCOUNTADMINロールにはテーブルが表示され、SYSADMINロールには表示されない」画面の構築をしていきます。

ロールによって変化する画面を作成

それではロールによって変化する画面をStreamlitで作成していきます。

完成図としては、ACCOUNTADMINに対しては、テーブルが表示される画面を出力し、

SYSADMINに対しては、表示されないよ~メッセージのみを出力していきます。

1. データベース構築

まず、Streamlit用のDBを作成していきます。

「OZAWADB」というDBを、SYSADMINロールで作成します。

-- Streamlit用のDB「OZAWADB」をSYSADMINで作成

USE ROLE SYSADMIN;
CREATE DATABASE OZAWADB;

次に、Streamlit画面の中で、ACCOUNTADMINロールのみで表示されるテーブルを作成していきます。

今回は、「OZAWADB.PUBLIC」スキーマに、「ADDRESS_TBL」というテーブルを作成します。

この操作は、SYSADMIN、ACCOUNTADMINどちらでも作成して大丈夫です。(今回はSYSADMINで作成します。)

-- Streamlit用の出力テーブル「ADDRESS_TBL」をSYSADMINで作成

USE ROLE SYSADMIN;
CREATE TABLE OZAWADB.PUBLIC.ADDRESS_TBL;

2. Streamlitファイルの作成

次に、「OZAWADB.PUBLIC」スキーマの中に、Streamlitファイルを作成していきます。

SYSADMINロールで、「Streamlit」→ 「+ Streamlit App」画面から、

「OZAWADB.PUBLIC」の中に、「Show different output for each role」という名前で、Streamlit Appのファイルを作成します。

これで、Streamlit画面開発のための前準備が完了です!

 

ステップ1, 2の作業によって、以下のようなデータベース・権限構造になっているはずです!

OZAWADB [SYSADMIN]
|--- PUBLIC [SYSADMINまたはそれ以下のロール]
|    |--- ADDRESS_TBL [SYSADMIN]
|    |--- xxxxxxxxxxxx (Stage) [SYSADMIN] //StreamlitのPythonコードを格納する場所

それでは、いよいよStreamlit画面のコードを記述していきます。

3. Streamlitファイルにコードを記述

「Streamlit」→「Streamlit Apps」から、先ほど作成した「Show different output for each role」アプリを選択します。

コード記述欄に、以下のソースコードを記述

# パッケージインストール
import streamlit as st
from snowflake.snowpark.context import get_active_session

# タイトル
st.title("ロールに応じて表示項目を変える")

# セッションを接続し、現在使用のロールを取得する。
session = get_active_session()
current_role = session.get_current_role()
st.write("現在のロールは", current_role, "です。")

# ACCOUNTADMINを使っている場合は、テーブルを出力
if current_role == '"ACCOUNTADMIN"':
    st.write('ACCOUNTADMINであることが確認できました。')
    st.write('住所テーブルを10件表示します。')
    access_history = session.sql('select PREF_NAME, CITY_NAME, STREET_NAME from OZAWADB.PUBLIC.ADDRESS_TBL')
    st.write(access_history.limit(10))
else:
# ACCOUNTADMIN以外を使っている場合は、出力しない
    st.write('ACCOUNTADMIN以外では表示できません。ロールを切り替えてください。')

ソースコードの主要部分を解説します。

一つ目

# セッションを接続し、現在使用のロールを取得する。
session = get_active_session()
current_role = session.get_current_role()

session = get_active_session() という関数を使うことで、Snowflakeにセッションを接続します。SnowSightで言えば、ワークシート上で、ロールとウェアハウスを選択している状態です。

session という変数から、get_current_role() 関数を使って、Snowflakeに接続しているリアルタイムのロールを取得できます。

session から獲得したリアルタイムのロールを current_role という変数に格納します。

二つ目

# ACCOUNTADMINを使っている場合は、テーブルを出力
if current_role == '"ACCOUNTADMIN"':
    st.write('ACCOUNTADMINであることが確認できました。')
    st.write('住所テーブルを10件表示します。')
    access_history = session.sql('select PREF_NAME, CITY_NAME, STREET_NAME from OZAWADB.PUBLIC.ADDRESS_TBL')

リアルタイムタイムのロールの値によって、条件分岐することで、表示項目を変化します。

今回で言うと、current_role が「ACCOUNTADMIN」である場合のみ、session.sql によってテーブルを出力します。

テスト

それでは、作成したStreamlit画面のテストを行っていきます。

まず、ホームページで、「SYSADMIN」を選択して検証します。

「Show different output for each role」アプリを開いてRUNすると…

ロールが「SYSADMIN」のため、テーブルが表示されません。

次に、「ACCOUNTADMIN」に切り替えて、RUNすると…

ロールが「ACCOUNTADMIN」にした結果、テーブルが表示されました!!!

おわりに

truestarではSnowflakeの検討、導入支援や環境構築からアプリ開発まで幅広くサポート可能です。

Snowflakeに゙興味がある、導入済みだけどもっとうまく活用したい等々ありましたら、ぜひこちらから相談ください!

MarketPlaceにてリリースした「逆ジオコーディングアプリ」、その開発裏話や、

Streamlit + chatgptを使った対話型アプリの試行錯誤も行っています!

これまでのSnowflakeに関する記事はこちら