Streamlit in Snowflake 入門

このトピックでは、 Streamlit in Snowflake を使い始める方法について説明します。

Streamlit in Snowflake を使用するための前提条件

Streamlit in Snowflake を使用するには、以下の前提条件を満たしている必要があります。

Streamlitアプリの作成と使用に必要な権限

Streamlit in Snowflake 内では、Streamlitアプリは、 Snowflake アクセス制御フレームワーク に準拠するセキュリティ保護可能なオブジェクトです。Streamlitアプリは、所有者の権限に基づく権限モデルを使用しています。詳細については 所有者の権利と Streamlit in Snowflake アプリの理解 をご参照ください。

アプリ編集者とStreamlitアプリを含むスキーマの所有者は、アプリの使用権限を持つロールを決定できます。ユーザーはアプリと対話することができ、Streamlitアプリが表示するものをすべて見ることができます。ユーザーには、所有者と同じアプリのビューが見えます。

詳細については、 Streamlitアプリを共有する をご参照ください

Streamlitアプリの作成に必要な権限

Streamlitアプリはスキーマレベルのオブジェクトです。

Streamlit in Snowflake を使用してStreamlitアプリを作成および編集するには、スキーマの OWNERSHIP 権限、または以下の権限の両方を持つロールを使用する必要があります。

  • Streamlitアプリを含むデータベースに対する付与:

    • USAGE

  • Streamlitアプリを含むスキーマに対する付与:

    • USAGE

    • CREATE STREAMLIT

    • CREATE STAGE

以下の例に示すように、 GRANT <権限> コマンドを使用してこれらの権限をロールに付与します。

GRANT USAGE ON SCHEMA streamlit_db.streamlit_schema TO ROLE streamlit_creator;
GRANT USAGE ON DATABASE streamlit_db TO ROLE streamlit_creator;
GRANT CREATE STREAMLIT ON SCHEMA streamlit_db.streamlit_schema TO ROLE streamlit_creator;
GRANT CREATE STAGE ON SCHEMA streamlit_db.streamlit_schema TO ROLE streamlit_creator;
Copy

将来の付与がデータベースまたはスキーマに定義されている場合は、将来の付与で定義されたロールを使用してユーザーがStreamlitアプリを作成するようにしてください。

Streamlitアプリの表示に必要な権限

Streamlitアプリを表示するには、Snowflakeアカウントを持っており、サインインしている必要があります。さらに、次に対する USAGE 権限が付与されたロールを使用する必要があります。

  • Streamlitアプリを含むデータベース。

  • Streamlitアプリを含むスキーマ。

  • Streamlit アプリの実行に使用されるウェアハウス。

  • Streamlitアプリ。

ほとんどの場合、アプリ所有者が他のロールとStreamlitアプリを共有すると、 USAGE 権限は自動的に新しいロールに付与されます。ただし、 MANAGED ACCESS を持つスキーマでStreamlitアプリが作成された場合は、 USAGE 権限を新しいロールに手動で付与する必要があります。

スキーマの所有者または MANAGE GRANTS 権限を持つロールのあるユーザーは、以下の例に示すように GRANT <権限> コマンドを使用して USAGE 権限を付与する必要があります。

GRANT USAGE ON DATABASE streamlit_db TO ROLE streamlit_role;
GRANT USAGE ON SCHEMA streamlit_db.streamlit_schema TO ROLE streamlit_role;
GRANT USAGE ON WAREHOUSE streamlit_wh TO ROLE streamlit_role;
GRANT USAGE ON STREAMLIT streamlit_db.streamlit_schema.streamlit_app TO ROLE streamlit_role;
Copy

サポートされているStreamlitライブラリのバージョン

Streamlit in Snowflake は、次のバージョンのStreamlitオープンソースライブラリをサポートしています。

  • 1.35.0

  • 1.31.1

  • 1.29.0

  • 1.26.0

  • 1.22.0

各バージョンのリリースノートを表示するには、 Streamlitライブラリの変更ログ をご参照ください。オープンソースStreamlitライブラリのいくつかの機能は、 Streamlit in Snowflake ではサポートされていないことに注意してください。 サポートされていないStreamlit機能 をご参照ください。

Streamlitライブラリのバージョンを選択する

各 Streamlit in Snowflake アプリについて、 Snowsight にある Streamlitライブラリバージョンを選択する か、アプリの environment.yml ファイルにある バージョンを固定します。バージョンを固定しない場合は、利用可能な最新バージョンが使用されます。

Snowflakeは、Snowflake Anaconda ChannelでStreamlitの新しいバージョンが利用可能になったときにアプリがアップグレードされないように、Streamlitのバージョンを固定することをお勧めします。

サポートされている外部パッケージ

デフォルトでは、 Streamlit in Snowflake には pythonstreamlitsnowflake-snowpark-python パッケージがプレインストールされています。環境には、これらのパッケージが必要とする依存関係に対するアクセスもあります。

Python 3.8で Streamlit in Snowflake アプリを実行します。

Streamlitアプリに追加パッケージをインストールすることができます。サポートされるパッケージのリストについては、 Snowflake Anaconda Channel をご参照ください。

Streamliltアプリにサポートされているパッケージを含める方法については、以下のトピックをご参照ください。

Streamlit in Snowflake でのウェアハウス選択のガイドライン

Streamlit in Snowflake でStreamlitアプリを実行する場合、Streamlitアプリの複雑さ、ウェアハウスの可用性、遅延、コストなど、複数の要因がパフォーマンスに影響する可能性があります。以下のセクションでは、 Streamlit in Snowflake で仮想ウェアハウスを使用するための一般的なガイドラインを示します。

小規模なウェアハウスを使用する

Streamlit in Snowflake でStreamlitアプリを実行する場合、可能な限り小さなウェアハウスを選択する必要があります。

実行中、ウェアハウスはStreamlitアプリが使用するPythonパッケージのキャッシュを維持します。Pythonパッケージのキャッシュは、パッケージを再度ダウンロードする代わりにキャッシュされたバージョンのパッケージを使用することで、後でアプリをロードする際のパフォーマンスを向上させます。キャッシュはウェアハウスが中断されると削除されるため、ウェアハウス再開後のアプリの初期読み込みが遅くなる可能性があります。再開されたウェアハウスが実行され、より多くのクエリが処理されると、パッケージのキャッシュが再構築され、キャッシュを利用できるアプリのロードパフォーマンスが向上します。

秒単位のクレジット請求と自動中断により、小規模のウェアハウスから始めて、Streamlitアプリのワークロードに合わせてウェアハウスのサイズを調整する柔軟性が得られることに注意してください。ウェアハウスのサイズはいつでも縮小できます。詳細については、 Streamlitアプリのウェアハウスを変更する をご参照ください。

専用のウェアハウスを使用する

Streamlit in Snowflake を使用する場合、SnowflakeではStreamlitアプリを実行するために専用のウェアハウスを使用することを推奨します。これにより、Streamlitアプリの運営コストを切り分けることができます。専用のウェアハウスは、ウェアハウスが他のワークロードを管理する必要がないため、アプリのロード時間も短縮できます。

詳細については、 ウェアハウスに関する考慮事項 をご参照ください。

Tip

初期化中にウェアハウスの中断を避けるため、自動中断を最小30秒に設定することを検討してください。

別のウェアハウスを使用してクエリを実行する

Streamlitアプリは、仮想ウェアハウスを使用してアプリとそのクエリを実行します。より高度なアプリやユースケースでは、複雑なクエリの実行が必要になる場合があり、より大規模なウェアハウスが必要になります。

Streamlit in Snowflake は、セッションの現在のウェアハウスを指定する USE WAREHOUSE コマンドをサポートしています。この方法で、X-Smallウェアハウスを使用してアプリを実行し、より大きなウェアハウスを使用して複雑なクエリを実行できます。

次のように、別のウェアハウスを使用してStreamlitアプリでクエリを実行できます。

import streamlit as st
from snowflake.snowpark.context import get_active_session

# Get the current credentials
session = get_active_session()

warehouse_sql = f"USE WAREHOUSE LARGE_WH"
session.sql(warehouse_sql).collect()

# Execute the SQL using a different warehouse
sql = """SELECT * from MY_DB.INFORMATION_SCHEMA.PACKAGES limit 100"""
session.sql(sql).collect()
Copy

注釈

ウェアハウスはクエリの実行期間中のみ使用されます。

最初の Streamlit in Snowflake アプリをビルドする

最初の Streamlit in Snowflake アプリを作成します。

  1. Snowsight にサインインします。

  2. ナビゲーションメニューで Projects » Streamlit を選択します。

  3. + Streamlit App を選択します。

  4. アプリのタイトルを入力し、データベース、スキーマ、ウェアハウスを選択します。

  5. Create を選択します。

Streamlit in Snowflake アプリでSnowflakeデータにアクセスする

このセクションでは、作成したStreamlit アプリを編集して、Snowflake テーブルからデータにアクセスします。

  1. データベースとスキーマに BUG_REPORT_DATA テーブルを作成します。

    CREATE OR REPLACE TABLE <your_database>.<your_schema>.BUG_REPORT_DATA (
      AUTHOR VARCHAR(25),
      BUG_TYPE VARCHAR(25),
      COMMENT VARCHAR(100),
      DATE DATE,
      BUG_SEVERITY NUMBER(38,0)
    );
    
    Copy
  2. BUG_REPORT_DATA テーブルにサンプルデータを追加します。

    INSERT INTO <your_database>.<your_schema>.BUG_REPORT_DATA (AUTHOR, BUG_TYPE, COMMENT, DATE, BUG_SEVERITY)
    VALUES
    ('John Doe', 'UI', 'The button is not aligned properly', '2024-03-01', 3),
    ('Aisha Patel', 'Performance', 'Page load time is too long', '2024-03-02', 5),
    ('Bob Johnson', 'Functionality', 'Unable to submit the form', '2024-03-03', 4),
    ('Sophia Kim', 'Security', 'SQL injection vulnerability found', '2024-03-04', 8),
    ('Michael Lee', 'Compatibility', 'Does not work on Internet Explorer', '2024-03-05', 2),
    ('Tyrone Johnson', 'UI', 'Font size is too small', '2024-03-06', 3),
    ('David Martinez', 'Performance', 'Search feature is slow', '2024-03-07', 4),
    ('Fatima Abadi', 'Functionality', 'Logout button not working', '2024-03-08', 3),
    ('William Taylor', 'Security', 'Sensitive data exposed in logs', '2024-03-09', 7),
    ('Nikolai Petrov', 'Compatibility', 'Not compatible with Safari', '2024-03-10', 2);
    
    Copy
  3. Streamlitアプリのコードを以下の例で編集します。

    import streamlit as st
    
    session = st.connection('snowflake').session()
    
    # Change the query to point to your table
    def get_data(_session):
        query = """
        select * from <your_database>.<your_schema>.BUG_REPORT_DATA
        order by date desc
        limit 100
        """
        data = _session.sql(query).collect()
        return data
    
    # Change the query to point to your table
    def add_row_to_db(session, row):
        sql = f"""INSERT INTO <your_database>.<your_schema>.BUG_REPORT_DATA VALUES
        ('{row['author']}',
        '{row['bug_type']}',
        '{row['comment']}',
        '{row['date']}',
        '{row['bug_severity']}')"""
    
        session.sql(sql).collect()
    
    st.set_page_config(page_title="Bug report", layout="centered")
    
    st.title("Bug report demo!")
    
    st.sidebar.write(
        f"This app demos how to read and write data from a Snowflake Table"
    )
    
    form = st.form(key="annotation", clear_on_submit=True)
    
    with form:
        cols = st.columns((1, 1))
        author = cols[0].text_input("Report author:")
        bug_type = cols[1].selectbox(
            "Bug type:", ["Front-end", "Back-end", "Data related", "404"], index=2
        )
        comment = st.text_area("Comment:")
        cols = st.columns(2)
        date = cols[0].date_input("Bug date occurrence:")
        bug_severity = cols[1].slider("Bug priority :", 1, 5, 2)
        submitted = st.form_submit_button(label="Submit")
    
    if submitted:
        try:
            add_row_to_db(
                session,
                {'author':author,
                'bug_type': bug_type,
                'comment':comment,
                'date':str(date),
                'bug_severity':bug_severity
            })
            st.success("Thanks! Your bug was recorded in the database.")
            st.balloons()
        except Exception as e:
            st.error(f"An error occured: {e}")
    
    expander = st.expander("See 100 most recent records")
    with expander:
        st.dataframe(get_data(session))
    
    Copy
  4. Run を選択し、Streamlitアプリを実行します。