用途
本技能用于在 Snowflake 内部原生构建和部署 Streamlit 应用,包括将应用作为 Native App 发布到 Snowflake Marketplace。适用场景包括:构建在 Snowflake 内运行的数据应用、需要 Snowpark 集成进行数据访问、将应用发布到 Snowflake Marketplace、为 Streamlit in Snowflake 搭建 CI/CD。
不适用场景:在 Snowflake 外部托管 Streamlit(应使用 Streamlit Community Cloud);构建通用 Snowpark 流水线(应使用 Snowpark 专用技能);需要自定义 Streamlit 组件(SiS 不支持)。
主要能力与使用方式
快速开始
- 初始化项目:将模板复制到项目目录,创建项目文件夹(如
mkdir my-streamlit-app && cd my-streamlit-app),模板由 Claude 提供。 - 配置
snowflake.yml:需填写标识符、stage、仓库等占位符,示例结构包含definition_version: 2、entities 下的 type 为 streamlit、identifier、stage、query_warehouse、main_file、pages_dir 以及 artifacts(如common/、environment.yml)。 - 部署:使用
snow streamlit deploy --replace,或加--open在浏览器中打开。
运行时环境
Snowflake 为 Streamlit 应用提供两种运行时:
- 仓库运行时(默认):为每位查看者创建个人实例;使用
environment.yml与 Snowflake Anaconda Channel;支持 Python 3.9、3.10、3.11;Streamlit 1.22.0 - 1.35.0;适合零散使用、隔离会话。 - 容器运行时(预览):为所有查看者创建共享实例;使用
requirements.txt或pyproject.toml配 PyPI 包;仅支持 Python 3.11;Streamlit 1.49+;成本显著更低(约 $2.88/天 vs 等效计算约 $48/天);适合频繁使用、成本优化。
容器运行时配置通过 CREATE STREAMLIT 语句设置 RUNTIME_NAME = 'SYSTEM$ST_CONTAINER_RUNTIME_PY3_11'、COMPUTE_POOL 和 QUERY_WAREHOUSE。关键区别:容器运行时允许外部 PyPI 包,不再局限于 Snowflake Anaconda Channel。
安全模型
- 所有者权限(默认):应用以所有者权限而非查看者权限执行,使用所有者配置的仓库,查看者可利用所有者角色权限访问任何数据。适用于内部工具和受信任用户。
- 调用者权限(v1.53.0+):应用以查看者权限执行,每位查看者仅能看到其有权限访问的数据,适用于公开或外部面向的应用、按用户的数据访问控制、多租户数据隔离。
关键模式
- Snowpark 会话连接:通过
st.connection("snowflake")获取会话,再执行 SQL 并转为 pandas DataFrame 展示。 - 调用者权限连接:使用
st.connection("snowflake", type="callers_rights")实现数据隔离。 - 缓存昂贵查询:使用
@st.cache_data(ttl=600);注意在 v1.22.0-1.53.0 中 params 参数不参与缓存键,参数化查询应使用ttl=0禁用缓存或升级到 1.54.0+。 - 优化 Snowpark DataFrame 性能:仅选择所需列,因为图表和表格组件会调用
to_pandas()评估所有列,预选列可减少数据传输,宽表可提升 5-10 倍。
项目结构与环境配置
标准项目结构包含 snowflake.yml(必需)、environment.yml(必需)、streamlit_app.py 主入口、pages/ 多页面目录、common/ 共享工具、.gitignore。environment.yml 必须使用 channels: - snowflake,并显式指定 streamlit=1.35.0(默认版本为较旧的 1.22.0)。
部署命令
- 基本部署:
snow streamlit deploy --replace,加--open可在浏览器打开,多实体时可指定实体名。 - CI/CD:参见
references/ci-cd.md的 GitHub Actions 工作流模板。 - Marketplace 发布(Native App):转换为 Native App(使用
templates-native-app/模板)、创建 Provider Profile、提交审批。
包可用性
仅 Snowflake Anaconda Channel 中的包可用,可通过 information_schema.packages 查询。常见可用包包括 pandas、numpy、scipy、plotly、altair (4.0)、matplotlib、scikit-learn、xgboost、snowflake-snowpark-python、streamlit 等。不可用:conda-forge 包、自定义/私有包、需要原生编译的包。
错误预防要点
本技能预防 14 类已记录的错误,包括:使用非 snowflake 渠道导致 PackageNotFoundError;默认 Streamlit 版本过旧;ROOT_LOCATION 已弃用;2026 年起仅密码认证失败;文件上传超过 200MB;数据显示超过 32MB;page_title 等不支持;自定义组件错误;_snowflake 模块迁移;缓存参数键问题;连接名与 secrets.toml 配置;Native App 版本意外升级;容器运行时子目录路径问题;宽表性能慢。
已知限制
- 数据与大小:后端/前端消息上限 32MB,文件上传上限 200MB,不支持
.so文件,仅支持内部 stage。 - UI 限制:
st.set_page_config的 page_title、page_icon、menu_items 不支持;st.bokeh_chart不支持;自定义组件仅限无外部服务调用者;CSP 阻止外部脚本、样式、字体、iframe;eval()被阻止。 - 缓存(仓库运行时):仅会话级,不跨用户持久;容器运行时支持跨查看者完整缓存。
- 包限制(仓库运行时):仅 Snowflake Anaconda Channel,无 conda-forge、无 pip;容器运行时允许 PyPI 包。
- 网络与访问:无 Azure Private Link / GCP Private Service Connect;Streamlit 对象不支持复制。
- 认证:仅密码认证正在弃用,Milestone 1(2025年9月-2026年1月)Snowsight 用户需 MFA;Milestone 2(2026年5-7月)所有新用户必须使用 MFA;Milestone 3(2026年8-10月)所有用户必须使用 MFA 或密钥对/OAuth。推荐方式:密钥对认证、OAuth 客户端凭据、工作负载身份联合。
限制与未提供信息
关于具体收费价格,除容器运行时成本对比数据外,其余定价信息暂未提供。完整 Marketplace 审批细节、Provider Profile 具体要求等以官方文档为准。