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에서는 Streamlit의 새 버전이 Snowflake Anaconda Channel에서 제공될 때 앱이 업그레이드되지 않도록 Streamlit 버전을 고정할 것을 권장합니다.

지원되는 외부 패키지

기본적으로 Streamlit in Snowflake 에는 사용자 환경에 미리 설치된 python, streamlit, snowflake-snowpark-python 패키지가 포함됩니다. 또한 이 환경은 이러한 패키지에 필요한 종속성에 액세스할 수 있습니다.

Streamlit in Snowflake 앱은 Python 3.8에서 실행됩니다.

Streamlit 앱에 추가 패키지를 설치할 수 있습니다. 지원되는 패키지 목록은 Snowflake Anaconda 채널 을 참조하십시오.

Streamlilt 앱에 지원되는 패키지를 포함하는 방법에 대한 자세한 내용은 다음 항목을 참조하십시오.

Streamlit in Snowflake 에서 웨어하우스를 선택할 때의 지침

Streamlit in Snowflake 에서 Streamlit 앱을 실행하면 Streamlit 앱의 복잡성, 웨어하우스 가용성, 대기 시간, 비용을 비롯한 여러 요소가 성능에 영향을 미칠 수 있습니다. 다음 섹션에서는 Streamlit in Snowflake 에서 가상 웨어하우스를 사용하기 위한 일반적인 지침을 제공합니다.

더 작은 웨어하우스 사용하기

Streamlit in Snowflake 에서 Streamlit 앱을 실행할 때 가능한 한 가장 작은 웨어하우스를 선택해야 합니다.

실행 시 웨어하우스는 Streamlit 앱에서 사용하는 Python 패키지의 캐시를 유지합니다. Python 패키지를 캐싱하면 패키지를 다시 다운로드하는 대신 캐시된 버전의 패키지를 사용하여 이후의 앱 로딩 시 성능이 향상됩니다. 웨어하우스가 일시 중단되면 캐시가 제거되며, 이로 인해 웨어하우스가 재개된 후 처음에 앱 로딩 속도가 느려질 수 있습니다. 재개된 웨어하우스가 더 많은 앱을 계속 실행함에 따라 패키지 캐시가 다시 작성되며 캐시를 활용할 수 있는 앱의 앱 로딩 성능이 향상됩니다.

초당 크레딧 청구 및 자동 일시 중단 덕분에 융통성 있게 작은 웨어하우스로 시작한 다음 Streamlit 앱의 워크로드에 맞게 웨어하우스 크기를 조정할 수 있습니다. 웨어하우스의 크기는 언제든지 늘릴 수 있습니다. 자세한 내용은 Streamlit 앱의 웨어하우스 변경하기 섹션을 참조하십시오.

전용 웨어하우스 사용하기

Streamlit in Snowflake 를 사용할 때는 Streamlit 앱 실행을 위한 전용 웨어하우스를 사용하는 것이 좋습니다. 이를 통해 Streamlit 앱 실행 비용을 분리할 수 있습니다. 전용 웨어하우스는 다른 워크로드를 관리할 필요가 없으므로 앱 로드 시간을 개선할 수도 있습니다.

자세한 내용은 웨어하우스 고려 사항 섹션을 참조하십시오.

초기화 중에 웨어하우스 일시 중단을 방지하려면 자동 일시 중단을 최소 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 앱을 실행합니다.