Externer Zugriff auf das Netzwerk in Streamlit in Snowflake

Unter diesem Thema wird beschrieben, wie Sie einen sicheren Zugriff auf Netzwerkstandorte außerhalb von Snowflake erstellen.

Externer Zugriff auf das Netzwerk in Streamlit in Snowflake

Sie können einen sicheren Zugriff auf bestimmte Netzwerkstandorte außerhalb von Snowflake erstellen und diesen Zugriff über den Code der Streamlit-App nutzen. Sie können den Zugriff über eine externe Zugriffsintegration ermöglichen.

Um einer Streamlit-Anwendung die Verwendung einer Integration für externen Zugriff (External Access Integration, EAI) zu ermöglichen, können Sie den Befehl CREATE STREAMLIT oder ALTER STREAMLIT ausführen und den Parameter EXTERNAL_ACCESS_INTEGRATIONS so einstellen, dass diese EAI einbezogen wird.

Mit einer EAI können Sie Python-Bibliotheken verwenden, die auf externe Speicherorte zugreifen, wie z. B. requests oder urllib, und Bibliotheken von Drittanbietern nutzen, die Zugriff auf einen Netzwerkspeicherort benötigen.

Weitere Informationen dazu finden Sie unter Übersicht über externen Netzwerkzugriff.

Beispiel: Zugriff auf die OpenAI API

Das folgende Beispiel zeigt, wie Sie eine EAI für eine ausgehende Anfrage an die OpenAI API erstellen.

  1. Um eine Netzwerkregel zu erstellen, die den Standort des externen Netzwerks und die Zugriffsbeschränkungen darstellt, verwenden Sie den Befehl CREATE NETWORK RULE:

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

    Weitere Informationen dazu finden Sie unter Erstellen einer Netzwerkregel zur Darstellung des externen Netzwerkstandorts.

  2. Um ein Geheimnis zu erstellen, das die Anmeldeinformationen darstellt, die für die Authentifizierung mit dem externen Speicherort des Netzwerks erforderlich sind, verwenden Sie den CREATE SECRET-Befehl:

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

    Weitere Informationen dazu finden Sie unter Erstellen eines Geheimnisses zur Darstellung von Anmeldeinformationen.

  3. Um eine EAI zu erstellen, führen Sie den CREATE EXTERNAL ACCESS INTEGRATION-Befehl aus und setzen ALLOWED_NETWORK_RULES auf die von Ihnen erstellte Netzwerkregel und ALLOWED_AUTHENTICATION_SECRETS auf das von Ihnen erstellte Geheimnis:

    CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION openai_access_int
      ALLOWED_NETWORK_RULES = (network_rules)
      ALLOWED_AUTHENTICATION_SECRETS = (openai_key)
      ENABLED = TRUE;
    
    Copy
  4. Um dem Ersteller der Streamlit-App die erforderlichen Berechtigungen zur Verwendung der Objekte SECRET und INTEGRATION für den externen Zugriff zu erteilen, verwenden Sie den Befehl GRANT <Berechtigungen> … TO ROLE:

    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. Damit die Streamlit-App die Integration nutzen kann, führen Sie den Befehl ALTER STREAMLIT aus und setzen die Eigenschaft EXTERNAL_ACCESS_INTEGRATIONS auf die Integration:

    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

    Bemerkung

    Sie können ein neues Streamlit-Objekt auch so einrichten, dass es eine externe Zugriffsintegration verwendet, indem Sie den Parameter EXTERNAL_ACCESS_INTEGRATIONS angeben, wenn Sie den Befehl CREATE STREAMLIT ausführen:

    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. Rufen Sie im Code Ihrer Streamlit-App die externe API auf:

    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