mcpField
S
streamlit-snowflake

streamlit-snowflake

github.com/jezwebデータ・データベース1.1k320 回インストール3 週間前に更新
リポジトリ

streamlit-snowflake について

streamlit-snowflakeは、Snowflake内でStreamlitデータアプリを構築・デプロイする開発者向けのスキルです。Snowparkでのデータアクセス、ランタイムや権限の選択、Native Appとしての公開を扱います。

主な機能

  1. 01Snowflake向けStreamlitプロジェクトの設定
  2. 02Snowpark経由のデータアクセス
  3. 03ウェアハウスまたはコンテナランタイムの選択
  4. 04オーナー権限または呼び出し元権限の設定
  5. 05アプリのデプロイとMarketplaceへの公開

活用シーン

  1. 01Snowflake上で動作するデータアプリの構築
  2. 02マルチテナントアプリでの閲覧者別アクセス設定
  3. 03StreamlitアプリのNative Appとしての公開
  4. 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.json
references/
authentication.md
available-packages.md
ci-cd.md
scripts/
check-packages.sql
templates-container-runtime/
README.md
requirements.txt
templates-native-app/
README.md
manifest.yml
setup.sql
templates/
.gitignore
environment.yml
snowflake.yml
streamlit_app.py
templates/common/
utils.py
templates/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 以降)呼び出し元権限公開アプリ、データの分離

出典:Streamlit 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 件の文書化されたエラーを防止します。

エラー原因防止策
PackageNotFoundErrorconda-forge または外部チャンネルを使用しているchannels: - snowflake を使用する(または PyPI では Container Runtime を使用する)
Streamlit の機能が不足しているデフォルトのバージョンが 1.22.0streamlit=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 supportedSiS の制限st.set_page_config() で page_title、page_icon、menu_items を使用しない
カスタムコンポーネントのエラーSiS の制限外部サービスを呼び出さないコンポーネントのみが動作する
_snowflake module not foundContainer 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 に公開するには:

  1. Native App に変換する - templates-native-app/ のテンプレートを使用します
  2. プロバイダープロファイルを作成する - Marketplace への掲載に必要です
  3. 審査に提出する - 公開前に 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年の期限)

パスワードのみの認証は廃止される予定です:

マイルストーン日付要件
マイルストーン12025年9月~2026年1月SnowsightユーザーにMFAが必須
マイルストーン22026年5月~7月すべての新規ユーザーにMFAの使用が必須
マイルストーン32026年8月~10月すべてのユーザーにMFAまたはキーペア/OAuthの使用が必須

推奨される認証方法:

  • キーペア認証(サービスアカウント向け)
  • OAuthクライアント認証情報(M2M向け)
  • ワークロードIDフェデレーション(クラウドネイティブアプリ向け)

実装パターンについては、references/authentication.mdを参照してください。

リソース

公式ドキュメント
例
ツール

コメント