streamlit-snowflake について
streamlit-snowflakeは、Snowflake内でStreamlitデータアプリを構築・デプロイする開発者向けのスキルです。Snowparkでのデータアクセス、ランタイムや権限の選択、Native Appとしての公開を扱います。
主な機能
- 01Snowflake向けStreamlitプロジェクトの設定
- 02Snowpark経由のデータアクセス
- 03ウェアハウスまたはコンテナランタイムの選択
- 04オーナー権限または呼び出し元権限の設定
- 05アプリのデプロイとMarketplaceへの公開
活用シーン
- 01Snowflake上で動作するデータアプリの構築
- 02マルチテナントアプリでの閲覧者別アクセス設定
- 03StreamlitアプリのNative Appとしての公開
- 04StreamlitアプリのCI/CDデプロイ設定
MCP 対応
READMEではClaude連携用のSnowflake MCP Serverに触れていますが、このスキル自体のMCP利用方法は説明されていません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ jezweb/ claude-skills --skill streamlit-snowflakeインストール後、Claude Code で/streamlit-snowflakeを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
README.md.claude-plugin/plugin.jsonreferences/authentication.mdavailable-packages.mdci-cd.mdscripts/check-packages.sqltemplates-container-runtime/README.mdrequirements.txttemplates-native-app/README.mdmanifest.ymlsetup.sqltemplates/.gitignoreenvironment.ymlsnowflake.ymlstreamlit_app.pytemplates/common/utils.pytemplates/pages/data_explorer.py詳細
Snowflake の Streamlit スキル
マーケットプレイスへの Native Apps としての公開を含め、Snowflake 内でネイティブに Streamlit アプリを構築、デプロイします。
クイックスタート
1. プロジェクトを初期化する
テンプレートをプロジェクトにコピーします。
# Create project directory
mkdir my-streamlit-app && cd my-streamlit-app
# Copy templates (Claude will provide these)
2. snowflake.yml を設定する
snowflake.yml 内のプレースホルダーを更新します。
definition_version: 2
entities:
my_app:
type: streamlit
identifier: my_streamlit_app # ← Your app name
stage: my_app_stage # ← Your stage name
query_warehouse: my_warehouse # ← Your warehouse
main_file: streamlit_app.py
pages_dir: pages/
artifacts:
- common/
- environment.yml
3. デプロイする
# Deploy to Snowflake
snow streamlit deploy --replace
# Open in browser
snow streamlit deploy --replace --open
このスキルを使用する場面
以下の場合に使用します:
- Snowflake 内でネイティブに動作するデータアプリを構築する
- データアクセスに Snowpark との統合が必要
- Snowflake Marketplace にアプリを公開する
- Snowflake での Streamlit 用 CI/CD を設定する
以下の場合は使用しないでください:
- Streamlit を外部でホスティングする(Streamlit Community Cloud を使用してください)
- 一般的な Snowpark パイプラインを構築する(Snowpark 専用のスキルを使用してください)
- カスタム Streamlit コンポーネントが必要(SiS ではサポートされていません)
ランタイム環境
Snowflake は、Streamlit アプリ向けに2 種類のランタイムオプションを提供しています。
ウェアハウスランタイム(デフォルト)
- 各閲覧者向けに個別のインスタンスを作成します
- Snowflake Anaconda Channel を使用する
environment.ymlを使います - Python 3.9、3.10、または 3.11
- Streamlit 1.22.0~1.35.0
- 最適な用途:断続的な使用、分離されたセッション
コンテナーランタイム(プレビュー)
- すべての閲覧者向けに共有インスタンスを作成します
- PyPI パッケージを使用する
requirements.txtまたはpyproject.tomlを使います - Python 3.11 のみ
- Streamlit 1.49 以降
- 大幅なコスト削減(同等のコンピューティングで約 2.88 ドル/日、約 48 ドル/日と比較)
- 最適な用途:頻繁な使用、コストの最適化
コンテナーランタイムの設定:
CREATE STREAMLIT my_app
FROM '@my_stage/app_folder'
MAIN_FILE = 'streamlit_app.py'
RUNTIME_NAME = 'SYSTEM$ST_CONTAINER_RUNTIME_PY3_11'
COMPUTE_POOL = my_compute_pool
QUERY_WAREHOUSE = my_warehouse;
**主な違い:**コンテナーランタイムでは、Snowflake Anaconda Channel に限定されず、外部の PyPI パッケージを使用できます。
参照:ランタイム環境
セキュリティモデル
Streamlit アプリは2 種類の権限モデルをサポートしています。
オーナー権限(デフォルト)
- アプリは閲覧者ではなく、オーナーの権限で実行されます
- アプリはオーナーによってプロビジョニングされたウェアハウスを使用します
- 閲覧者は、オーナーロールのすべての権限を使ってデータを操作できます
セキュリティ上の注意点:
- アプリのロールに書き込み権限を付与する際は注意してください
- アプリの作成と閲覧には専用のロールを使用してください
- 閲覧者は、オーナーロールがアクセスできるすべてのデータにアクセスできます
- 最適な用途:信頼できるユーザー向けの社内ツール
呼び出し元権限(v1.53.0 以降)
- アプリは閲覧者の権限で実行されます
- 各閲覧者には、アクセス権限のあるデータのみが表示されます
- マルチテナントのシナリオでデータの分離を実現します
呼び出し元権限を使用する場面:
- 公開アプリまたは外部向けアプリを構築する
- ユーザーごとのデータアクセス制御が必要
- データの分離が必要なマルチテナントアプリケーション
以下の呼び出し元権限の接続パターンを参照してください。
プロジェクト構成
my-streamlit-app/
├── snowflake.yml # Project definition (required)
├── environment.yml # Package dependencies (required)
├── streamlit_app.py # Main entry point
├── pages/ # Multi-page apps
│ └── data_explorer.py
├── common/ # Shared utilities
│ └── utils.py
└── .gitignore
主なパターン
Snowpark セッション接続
import streamlit as st
# Get Snowpark session (native SiS connection)
conn = st.connection("snowflake")
session = conn.session()
# Query data
df = session.sql("SELECT * FROM my_table LIMIT 100").to_pandas()
st.dataframe(df)
呼び出し元権限の接続(v1.53.0 以降)
オーナーの権限ではなく、閲覧者の権限でクエリを実行します。
import streamlit as st
# Use caller's rights for data isolation
conn = st.connection("snowflake", type="callers_rights")
# Each viewer sees only data they have permission to access
df = conn.query("SELECT * FROM sensitive_customer_data")
st.dataframe(df)
セキュリティの比較:
| 接続タイプ | 権限モデル | 用途 |
|---|---|---|
type="snowflake"(デフォルト) | オーナー権限 | 社内ツール、信頼できるユーザー |
type="callers_rights"(v1.53.0 以降) | 呼び出し元権限 | 公開アプリ、データの分離 |
負荷の高いクエリのキャッシュ
@st.cache_data(ttl=600) # Cache for 10 minutes
def load_data(query: str):
conn = st.connection("snowflake")
return conn.session().sql(query).to_pandas()
# Use cached function
df = load_data("SELECT * FROM large_table")
警告:Streamlit v1.22.0~1.53.0 では、params 引数はキャッシュキーに含まれません。パラメーター化クエリを使用する場合は ttl=0 を設定してキャッシュを無効にするか、利用可能になり次第 1.54.0 以降にアップグレードしてください(Issue #13644)。
Snowpark DataFrame のパフォーマンスを最適化する
Snowpark DataFrame をグラフやテーブルで使用する場合は、不要なデータの取得を避けるため、必要な列のみを選択してください。
# ❌ Fetches all 50 columns even though chart only needs 2
df = session.table("wide_table") # 50 columns
st.line_chart(df, x="date", y="value")
# ✅ Fetch only needed columns for better performance
df = session.table("wide_table").select("date", "value")
st.line_chart(df, x="date", y="value")
# 5-10x faster for wide tables
重要な理由:st.dataframe() とグラフコンポーネントは df.to_pandas() を呼び出し、可視化に一部の列しか必要ない場合でも、すべての列を評価します。事前に列を選択すると、データ転送量が減り、パフォーマンスが向上します(Issue #11701)。
環境設定
environment.yml(必須形式):
name: sf_env
channels:
- snowflake # REQUIRED - only supported channel
dependencies:
- streamlit=1.35.0 # Explicit version (default is old 1.22.0)
- pandas
- plotly
- altair=4.0 # Version 4.0 supported in SiS
- snowflake-snowpark-python
エラーの防止
このスキルでは、14 件の文書化されたエラーを防止します。
| エラー | 原因 | 防止策 |
|---|---|---|
PackageNotFoundError | conda-forge または外部チャンネルを使用している | channels: - snowflake を使用する(または PyPI では Container Runtime を使用する) |
| Streamlit の機能が不足している | デフォルトのバージョンが 1.22.0 | streamlit=1.35.0 を明示的に設定する(または 1.49 以降では Container Runtime を使用する) |
ROOT_LOCATION deprecated | 古い CLI 構文 | Snowflake CLI 3.14.0 以降で FROM source_location を使用する |
| 認証の失敗(2026 年以降) | パスワードのみの認証 | キーペアまたは OAuth を使用する(references/authentication.md を参照) |
| ファイルのアップロードに失敗する | ファイルが 200MB 超 | アップロードを 200MB の上限以下にする |
| DataFrame の表示に失敗する | データが 32MB 超 | 表示前にページネーションするか、データ量を制限する |
page_title not supported | SiS の制限 | st.set_page_config() で page_title、page_icon、menu_items を使用しない |
| カスタムコンポーネントのエラー | SiS の制限 | 外部サービスを呼び出さないコンポーネントのみが動作する |
_snowflake module not found | Container Runtime への移行 | from _snowflake import get_active_session の代わりに from snowflake.snowpark.context import get_active_session を使用する(移行ガイド) |
| パラメーターが異なると、キャッシュされたクエリが誤ったデータを返す | params がキャッシュキーに含まれていない(v1.22.0-1.53.0) | パラメーター付きクエリのキャッシュを無効にするには ttl=0 を使用するか、利用可能になった時点で 1.54.0 以降にアップグレードする(Issue #13644) |
kwargs のみを指定すると Invalid connection_name 'default' が発生する | secrets.toml または connections.toml がない | [connections.snowflake] セクションを含む最小限の .streamlit/secrets.toml を作成する(Issue #9016) |
| Native App が予期せずアップグレードされる | Streamlit バージョンが暗黙的にデフォルト設定されている(BCR-1857) | 自動的なバージョン変更を防ぐため、environment.yml で streamlit=1.35.0 を明示的に設定する(BCR-1857) |
| Container Runtime のサブディレクトリでファイルパスが機能しない | 一部のコマンドがエントリーポイントを基準とするパスを使用する | pathlib を使用して絶対パスを解決する:Path(__file__).parent / "assets/logo.png"(Runtime Docs) |
| 幅の広い Snowpark DataFrame でパフォーマンスが低下する | st.dataframe() は未使用の列もすべて取得する | Streamlit に渡す前に、必要な列のみを選択する:df.select("col1", "col2")(Issue #11701) |
デプロイコマンド
基本的なデプロイ
# Deploy and replace existing
snow streamlit deploy --replace
# Deploy and open in browser
snow streamlit deploy --replace --open
# Deploy specific entity (if multiple in snowflake.yml)
snow streamlit deploy my_app --replace
CI/CD デプロイ
GitHub Actions のワークフローテンプレートについては、references/ci-cd.md を参照してください。
Marketplace への公開(Native App)
Streamlit アプリを Snowflake Marketplace に公開するには:
- Native App に変換する -
templates-native-app/のテンプレートを使用します - プロバイダープロファイルを作成する - Marketplace への掲載に必要です
- 審査に提出する - 公開前に Snowflake が審査します
ワークフローの全容については、templates-native-app/README.md を参照してください。
Native App の構造
my-native-app/
├── manifest.yml # Native App manifest
├── setup.sql # Installation script
├── streamlit/
│ ├── environment.yml
│ ├── streamlit_app.py
│ └── pages/
└── README.md
パッケージの利用可能状況
Snowflake Anaconda Channel のパッケージのみ利用できます:
-- Query available packages
SELECT * FROM information_schema.packages
WHERE language = 'python'
ORDER BY package_name;
-- Search for specific package
SELECT * FROM information_schema.packages
WHERE language = 'python'
AND package_name ILIKE '%plotly%';
一般的に利用できるパッケージ:
- pandas、numpy、scipy
- plotly、altair(4.0)、matplotlib
- scikit-learn、xgboost
- snowflake-snowpark-python
- streamlit(デフォルトは1.22.0、バージョンを明示すると1.35.0)
利用できないもの:
- conda-forge のパッケージ
- カスタム/プライベートパッケージ
- ネイティブコンパイルが必要なパッケージ
詳細は、Snowpark Python Packages Explorerを参照してください。
既知の制限事項
データとサイズの制限
- バックエンド/フロントエンド間のメッセージサイズは32 MB(大きな
st.dataframeに影響します) st.file_uploaderによるファイルのアップロード上限は200 MB.soファイルは利用できません。ネイティブコンパイルされたライブラリはサポートされていません- 外部ステージは利用できません。内部ステージのみ利用できます(クライアント側暗号化)
UIの制限
st.set_page_config:page_title、page_icon、menu_itemsはサポートされていませんst.bokeh_chart:サポートされていません- カスタムStreamlitコンポーネント:外部サービスを呼び出さないコンポーネントのみ利用できます
- コンテンツセキュリティポリシー:外部のスクリプト、スタイル、フォント、iframeをブロックします
eval()はブロックされます。CSPにより、安全でないJavaScriptの実行が防止されます
キャッシュ(ウェアハウスランタイム)
- セッション単位のみ:
st.cache_dataとst.cache_resourceはユーザー間で保持されません - コンテナランタイムでは、閲覧者間でのキャッシュが完全にサポートされています
パッケージの制限(ウェアハウスランタイム)
- Snowflake Anaconda Channelのみ。conda-forgeおよびpipは利用できません
- コンテナランタイムではPyPIパッケージを利用できます
ネットワークとアクセス
- Azure Private Link/GCP Private Service Connectは利用できません
- Streamlitオブジェクトのレプリケーションには対応していません
認証(重要 — 2026年の期限)
パスワードのみの認証は廃止される予定です:
| マイルストーン | 日付 | 要件 |
|---|---|---|
| マイルストーン1 | 2025年9月~2026年1月 | SnowsightユーザーにMFAが必須 |
| マイルストーン2 | 2026年5月~7月 | すべての新規ユーザーにMFAの使用が必須 |
| マイルストーン3 | 2026年8月~10月 | すべてのユーザーにMFAまたはキーペア/OAuthの使用が必須 |
推奨される認証方法:
- キーペア認証(サービスアカウント向け)
- OAuthクライアント認証情報(M2M向け)
- ワークロードIDフェデレーション(クラウドネイティブアプリ向け)
実装パターンについては、references/authentication.mdを参照してください。
リソース
公式ドキュメント
例
ツール
- Snowpark Python Packages Explorer
- Snowflake MCP Server(Claudeとの連携用)