その他の Streamlit in Snowflake 機能

このトピックでは、 Streamlit in Snowflake の追加機能について説明します。

Streamlit in Snowflake のカスタム UI

カスタム UI により、 Streamlit in Snowflake アプリのルック、フィール、そしてフロントエンドの動作をカスタマイズできるようになります。この機能は以下をサポートしています。

  • st.markdownunsafe_allow_html=True を使用したカスタム HTML および CSS。

  • st.components.v1.html を使用してiframe化した HTML、 CSS、 および JavaScript。

注釈

カスタム UI にはContent Security Policy (CSP) に関連するいくつかの制限があります。詳細については、 Streamlit in Snowflake で外部リソースを読み込む際の制限 をご参照ください。

Streamlit in Snowflake アプリのカスタマイズを開始するには、 st.components.v1.html 、または st.markdownunsafe_allow_html=True と呼び出すだけです。提供された HTML は、ユーザーのブラウザでアプリのフロントエンドに追加されます。

注釈

インラインで HTML を指定するか、 HTML を文字列に読み込む必要があります。実行または埋め込むコマンドに、 URL やファイルパスを直接渡すことはできません。

Streamlit in Snowflake アプリのカスタマイズについては、以下の例を参照してください。

  • サイドバーの背景色をカスタマイズします。

    st.markdown("""
      <style>
        [data-testid=stSidebar] {
          background-color: #94d3e6;
        }
      </style>
    """, unsafe_allow_html=True)
    
    Copy
  • streamlit-extras でアプリのロゴを追加します。

    実行する前に、必ず streamlit-extras パッケージをインストールしてください。

    from streamlit_extras.app_logo import add_logo
    add_logo("./Logo.png", height=60)
    
    Copy
  • サイドバーの幅をプログラムで設定します。

    import streamlit.components.v1 as components
    
    components.html("""
      <script>
        window.parent.document.querySelector('[data-testid="stSidebar"]').style.width = "300px";
      </script>
    """, height=0)
    
    Copy
  • ydata-profiling を使って、 DataFrame 探索的データ分析( EDA )をブラウザ内で作成します。

    import streamlit as st
    import streamlit.components.v1 as components
    from sklearn.datasets import load_iris
    from ydata_profiling import ProfileReport
    
    st.set_page_config(layout="wide")
    df = load_iris(as_frame=True).data
    html = ProfileReport(df).to_html()
    components.html(html, height=500, scrolling=True)
    
    Copy

Streamlit in Snowflake の外部ネットワークアクセス

Snowflakeの外部にある特定のネットワークロケーションへの安全なアクセスを作成し、Streamlitアプリのコード内からそのアクセスを使用できるようになりました。アクセスは、外部アクセス統合を介して有効にすることができます。

Streamlit アプリが外部アクセス統合を使用できるようにするには、 CREATE STREAMLIT または ALTER STREAMLIT コマンドを実行し、 EXTERNAL_ACCESS_INTEGRATIONS パラメータにその統合を含めるように設定します。

外部アクセス統合を使うと、 requestsurllib のような、外部の場所にアクセスするPythonライブラリを使ったり、ネットワーク上の場所にアクセスする必要のあるサードパーティのライブラリを使ったりすることができます。

詳細については、 外部ネットワークアクセスの概要 をご参照ください。

例: OpenAI API にアクセスする

次の例は、 OpenAI API へのアウトバウンド リクエストのために、外部アクセス統合を作成する方法を示しています。この例には、セキュリティ統合の設定と必要な権限の付与が含まれます。

  1. CREATE NETWORK RULE コマンドを使って、外部ネットワークロケーションとアクセス制限を表すネットワークルールを作成することができます。

    CREATE OR REPLACE NETWORK RULE network_rules
      MODE = EGRESS
      TYPE = HOST_PORT
      VALUE_LIST = ('api.openai.com');
    
    Copy

    詳細については、 外部ネットワークロケーションを表すネットワークルールの作成 をご参照ください。

  2. CREATE SECRET を使用して、外部ネットワークロケーションとの認証に必要な認証情報を表すシークレットを作成することができます。

    CREATE OR REPLACE SECRET openai_key
      TYPE = GENERIC_STRING
      SECRET_STRING = '<any_string>';
    
    Copy

    詳細については、 認証情報を表すシークレットの作成 をご参照ください。

  3. 外部アクセス統合を作成するには、 CREATE EXTERNAL ACCESS INTEGRATION コマンドを実行し、 ALLOWED_NETWORK_RULES を作成したネットワークルールに、 ALLOWED_AUTHENTICATION_SECRETS を作成したシークレットに設定します。

    CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION openai_access_int
      ALLOWED_NETWORK_RULES = (network_rules)
      ALLOWED_AUTHENTICATION_SECRETS = (openai_key)
      ENABLED = TRUE;
    
    Copy
  4. Streamlit アプリ作成者に外部アクセス用の SECRET と INTEGRATION オブジェクトを使用するために必要な権限を付与するには、次の例に示すように GRANT <権限> コマンドを使用します。

    GRANT READ ON SECRET openai_key TO ROLE streamlit_app_creator_role;
    GRANT USAGE ON INTEGRATION openai_access_int TO ROLE streamlit_app_creator_role;
    
    Copy
  5. Streamlit アプリがインテグレーションを使用できるようにするには、 ALTER STREAMLIT コマンドを実行し、次の例に示すように EXTERNAL_ACCESS_INTEGRATIONS プロパティをインテグレーションに設定します。

    USE ROLE streamlit_app_creator_role;
    
    ALTER STREAMLIT streamlit_db.streamlit_schema.streamlit_app
      SET EXTERNAL_ACCESS_INTEGRATIONS = (openai_access_int)
      SECRETS = ('my_openai_key' = streamlit_db.streamlit_schema.openai_key);
    
    Copy

    注釈

    次の例に示すように、 CREATE STREAMLIT コマンドを実行する際に EXTERNAL_ACCESS_INTEGRATIONS パラメータを指定することで、外部アクセス統合を使用する新しい Streamlit オブジェクトを設定することもできます。

    CREATE STREAMLIT streamlit_db.streamlit_schema.streamlit_app
      ROOT_LOCATION = '<stage_path_and_root_directory>'
      MAIN_FILE = '<path_to_main_file_in_root_directory>'
      EXTERNAL_ACCESS_INTEGRATIONS = (openai_access_int)
      SECRETS = ('my_openai_key' = streamlit_db.streamlit_schema.openai_key);
    
    Copy
  6. Streamlit アプリのコードで、以下の例のように外部 API を呼び出します。

    from openai import OpenAI
    import streamlit as st
    import _snowflake
    
    st.title(":speech_balloon: Simple chat app using an external LLM")
    st.write("This app shows how to call an external LLM to build a simple chat application.")
    
    # Use the _snowflake library to access secrets
    secret = _snowflake.get_generic_secret_string('my_openai_key')
    client = OpenAI(api_key=secret)
    
    # ...
    # code to use API
    # ...
    
    Copy

Streamlitアプリのカスタムスリープタイマー

Streamlitアプリを自動的に一時停止するためのカスタムスリープタイマーを設定できます。カスタムスリープタイマーを設定するには、 STREAMLIT オブジェクトの ROOT_LOCATION パラメーターで指定されたパスにある .streamlit フォルダー内に config.toml 構成ファイルを作成します。

たとえば、Streamlitアプリを8分後に自動的に一時停止させる場合は、 config.toml ファイルに次のコードを追加します。

[snowflake]
[snowflake.sleep]
streamlitSleepTimeoutMinutes = 8
Copy

次の例に示すように、 config.toml ファイルをステージの場所にアップロードします。

PUT file:///<path_to_your_root_folder>/my_app/config.toml @streamlit_db.streamlit_schema.streamlit_stage/.streamlit/ overwrite=true auto_compress=false;
Copy

Streamlitファイルの操作については、 SQL を使用してStreamlitアプリを作成し、デプロイします。 をご参照ください。

注釈

streamlitSleepTimeoutMinutes は、5分から240分の間で任意の値を設定できます。

タイマーを指定するための構成ファイルを作成しない場合、デフォルトの自動一時停止時間は15分になります。

Streamlit in Snowflake のコンテキスト関数と行アクセス・ポリシー

Streamlit in Snowflake アプリで、 CURRENT_USER のような コンテキスト関数 と、 行アクセスポリシー を持つテーブルからのデータを使用するには、 ACCOUNTADMIN ロールを持つユーザーが、次の例に示すように、グローバル READ SESSION 権限を Streamlit アプリ所有者ロールに付与する必要があります。

USE ROLE ACCOUNTADMIN;
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
Copy

注釈

Streamlit in Snowflake アプリでは、 CURRENT_ROLE を使用する行アクセス・ポリシーは使用できません。 Streamlit in Snowflake アプリはオーナー権限で実行されるため、Streamlit アプリ内で CURRENT_ROLE を使用すると、常にアプリのオーナー・ロールが返されます。詳細については、 所有者の権利と Streamlit in Snowflake アプリの理解 をご参照ください。

例: CURRENT_USER を使用して行アクセスポリシーのテーブルのデータにアクセスします。

Streamlit in Snowflake アプリを使って、行アクセスポリシーで保護されたテーブルの行へのアクセスを管理することができます。行アクセスポリシーの本文に CURRENT_USER 関数を指定し、行アクセスポリシーをテーブルに追加します。

次の例は、 Streamlit in Snowflake アプリで、行アクセス・ポリシーで保護されたテーブルへのアクセスを管理する方法を示しています。

  1. テーブルを作成してデータを挿入します。

    CREATE TABLE row_access_policy_test_table (
        id INT,
        some_data VARCHAR(100),
        the_owner VARCHAR(50)
    );
    
    INSERT INTO row_access_policy_test_table (id, some_data, the_owner)
    VALUES
        (4, 'Some information 4', 'ALICE'),
        (5, 'Some information 5', 'FRANK'),
        (6, 'Some information 6', 'ALICE');
    
    Copy
  2. 行アクセスポリシーを作成します。

    CREATE OR REPLACE ROW ACCESS POLICY st_schema.row_access_policy
    AS (the_owner VARCHAR) RETURNS BOOLEAN ->
        the_owner = CURRENT_USER();
    
    Copy
  3. 行アクセスポリシーをテーブルに追加します。

    ALTER TABLE row_access_policy_test_table ADD ROW ACCESS POLICY st_schema.row_access_policy ON (the_owner);
    
    Copy
  4. Streamlitアプリを作成します。

  5. グローバル READ SESSION 権限を Streamlit アプリの所有者ロールに付与します。

    GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
    
    Copy
  6. 以下のコードを Streamlit アプリに追加します。

    # Import Python packages
    import streamlit as st
    from snowflake.snowpark.context import get_active_session
    
    st.title("CURRENT_USER() + Row Access Policy in SiS Demo :balloon:")
    st.write(
            """You can access `CURRENT_USER()` and data from tables with row access policies
            in Streamlit in Snowflake apps
            """)
    
    # Get the current credentials
    session = get_active_session()
    
    st.header('Demo')
    
    st.subheader('Credentials')
    sql = "SELECT CURRENT_USER();"
    df = session.sql(sql).collect()
    st.write(df)
    
    st.subheader('Row Access on a Table')
    sql = "SELECT * FROM st_db.st_schema.row_access_policy_test_table;"
    df = session.sql(sql).collect()
    
    st.write(df)
    
    Copy