こんにちは。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に関する記事はこちら