Streamlit in Snowflake 其他功能¶
本主题介绍了 Streamlit in Snowflake 的其他功能。
Streamlit in Snowflake 中的外部网络访问¶
您可以创建对 Snowflake 外部特定网络位置的安全访问,并且可以从 Streamlit 应用程序代码中使用该访问。可以通过外部访问集成启用访问权限。
要使 Streamlit 应用程序能够使用外部访问集成,可以运行 CREATE STREAMLIT 或 ALTER STREAMLIT 命令并设置 EXTERNAL_ACCESS_INTEGRATIONS 参数以包含该集成。
借助外部访问集成,可以使用访问外部位置的 Python 库(例如 requests
或者 urllib
),并使用需要访问网络位置的第三方库。
有关更多信息,请参阅 外部网络访问概述。
示例:访问 OpenAI API¶
以下示例显示了如何为向 OpenAI API 发出的出站请求创建外部访问集成。此示例包括设置安全集成并授予所需权限。
要创建表示外部网络位置和访问限制的网络规则,可以使用 CREATE NETWORK RULE 命令:
CREATE OR REPLACE NETWORK RULE network_rules MODE = EGRESS TYPE = HOST_PORT VALUE_LIST = ('api.openai.com');
有关更多信息,请参阅 创建网络规则以表示外部网络位置。
要创建表示对外部网络位置进行身份验证所需凭据的密钥,可以使用 CREATE SECRET 命令:
CREATE OR REPLACE SECRET openai_key TYPE = GENERIC_STRING SECRET_STRING = '<any_string>';
有关更多信息,请参阅 创建表示凭据的密钥。
要创建外部访问集成,可以运行 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;
要授予所需权限以便使用 SECRET 和 INTEGRATION 对象对 Streamlit 应用程序创建器进行外部访问,可以使用 GRANT <privileges> ... 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;
要使 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);
备注
还可以在运行 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);
在 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 # ...
为 Streamlit 应用程序自定义睡眠计时器¶
您可以为 Streamlit 应用程序设置自定义睡眠计时器,以使其自动暂停。
要设置自定义睡眠计时器,请在
.streamlit
文件夹内创建config.toml
配置文件,此文件夹的路径由 STREAMLIT 对象的ROOT_LOCATION
参数指定。例如,如果希望 Streamlit 应用程序在 8 分钟后自动暂停,请在
config.toml
文件中添加以下内容:[snowflake] [snowflake.sleep] streamlitSleepTimeoutMinutes = 8
将
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;
有关使用 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;
备注
在 Streamlit in Snowflake 应用程序中,不能使用已使用了 CURRENT_ROLE 的行访问策略。Streamlit in Snowflake 应用程序以所有者权限运行,因此在 Streamlit 应用程序中使用 CURRENT_ROLE 将始终返回应用程序所有者角色。有关更多信息,请参阅 了解所有者的权限和 Streamlit in Snowflake 应用程序。
示例:使用 CURRENT_USER 访问具有行访问策略的表中的数据¶
您可以使用 Streamlit in Snowflake 应用程序来治理对受行访问策略保护的表中的行的访问。在行访问策略的正文中指定 CURRENT_USER 函数,并将行访问策略添加到表中。
以下示例演示了如何在 Streamlit in Snowflake 应用程序中治理对受行访问策略保护的表的访问。
创建表并插入数据:
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');
创建行访问策略:
CREATE OR REPLACE ROW ACCESS POLICY st_schema.row_access_policy AS (the_owner VARCHAR) RETURNS BOOLEAN -> the_owner = CURRENT_USER();
将行访问策略添加到表中:
ALTER TABLE row_access_policy_test_table ADD ROW ACCESS POLICY st_schema.row_access_policy ON (the_owner);
创建一个 Streamlit 应用程序。
将全局 READ SESSION 权限授予 Streamlit 应用程序所有者角色:
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_owner_role;
将以下代码添加到 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)