추가 Streamlit in Snowflake 기능

이 항목에서는 추가 Streamlit in Snowflake 기능에 대해 설명합니다.

Streamlit in Snowflake 의 사용자 지정 UI

사용자 지정 UI를 사용하면 Streamlit in Snowflake 앱의 디자인과 프런트엔드 동작을 사용자 지정할 수 있습니다. 이 기능은 다음을 지원합니다.

  • st.markdown 에서 unsafe_allow_html=True 를 사용한 사용자 지정 HTML 및 CSS.

  • st.components.v1.html 을 사용한 iframe 처리된 HTML, CSS 및 JavaScript.

참고

사용자 지정 UI에는 콘텐츠 보안 정책(CSP)과 관련된 몇 가지 제한 사항이 있습니다. 자세한 내용은 Streamlit in Snowflake 에서 외부 리소스를 로드할 때의 제한 사항 섹션을 참조하십시오.

Streamlit in Snowflake 앱 사용자 지정을 시작하려면 st.components.v1.html 또는 st.markdown 과 함께 unsafe_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 매개 변수를 설정하면 됩니다.

외부 액세스 통합을 사용하면 requests 또는 urllib 와 같이 외부 위치에 액세스하는 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 구성 파일을 생성합니다.

예를 들어, 8분 후에 Streamlit 앱이 자동 일시 중단되도록 하려면 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 역할이 있는 사용자가 Streamlit 앱 소유자 역할에 전역 READ SESSION 권한을 부여해야 합니다.

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. Streamlit 앱 소유자 역할에 전역 READ SESSION 권한을 부여합니다.

    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