コンテナランタイム版の Streamlit in Snowflake を Snowflake CLI でローカルからデプロイしてみた

コンテナランタイム版の Streamlit in Snowflake を Snowflake CLI でローカルからデプロイしてみた

2026.01.07

はじめに

2025年12月のアップデートで Streamlit in Snowflake(SiS) のコンテナランタイムがパブリックプレビューとなりました。

https://docs.snowflake.com/en/release-notes/streamlit-in-snowflake#dec-11-2025-support-for-sis-container-runtime-preview

Snowflake CLI からコンテナランタイムを使用する Streamlit オブジェクトのデプロイ試してみましたので、その内容を記事としました。

Container Runtime の概要

SiS のランタイムについては、以下に記載があります。

https://docs.snowflake.com/en/developer-guide/streamlit/app-development/runtime-environments

コンテナランタイムを使用することで、コンピュートプールから Streamlit アプリの専用インスタンスが提供され、このインスタンスをすべてのユーザーで共有します。コンピュートプールの時間当たりのコストは通常の仮想ウェアハウスよりも安価なため、特に頻繁に長時間実行されるようなアプリでは恩恵を受けられます。

インスタンスの起動までには多少時間を要しますが、ユーザー間で同じインスタンスを共有するため、Streamlit のキャッシュも利用でき、パフォーマンス面でもメリットがあります。その他、アプリで発生するクエリには従来の仮想ウェアハウスを使用できるため、ワークロードを分離しつつ、それぞれで最適化も可能です。

本機能については、tsubasaさんの以下の記事でとても詳しく解説されています。

https://zenn.dev/snowflakejp/articles/abe3379e6e44cd

前提条件

本記事では以下の環境を使用しています。

  • Snowflake 商用アカウント
    • 外部ネットワークアクセスのため
  • Snowflake CLI version: 3.14.0

事前準備

Streamlit オブジェクトを作成するために必要な各種オブジェクトとアプリ作成用のロールを用意しておきます。

USE ROLE SYSADMIN;
-- データベース・スキーマ
CREATE DATABASE IF NOT EXISTS yasuhara_st_db;
CREATE SCHEMA IF NOT EXISTS yasuhara_st_db.app;

-- ロール
USE ROLE USERADMIN;
CREATE ROLE IF NOT EXISTS yasuhara_st_creator;

-- 権限付与
USE ROLE SECURITYADMIN;
-- ロール継承
GRANT ROLE yasuhara_st_creator TO ROLE SYSADMIN;
-- データベース・スキーマの使用権限
GRANT USAGE ON DATABASE yasuhara_st_db TO ROLE yasuhara_st_creator;
GRANT USAGE ON SCHEMA yasuhara_st_db.app TO ROLE yasuhara_st_creator;
-- スキーマへのStreamlit作成権限
GRANT CREATE STREAMLIT ON SCHEMA yasuhara_st_db.app TO ROLE yasuhara_st_creator;

また、Snowflake CLI からの認証はキーペアを使用するため、開発用ユーザーに対して公開鍵の値を割り当てておきます。

ALTER USER <user> SET RSA_PUBLIC_KEY = 'MII・・・';

こちらの手順は以下の記事をご参照ください。

https://dev.classmethod.jp/articles/snowflake-cli-install-and-connect-with-keypair/

コンピュートプールと外部アクセス統合の作成

コンテナランタイムを使用するには、コンピュートプールが必要です。また、PyPI からパッケージをインストールするため、外部アクセス統合を作成します。

-- コンピュートプールの作成
CREATE COMPUTE POOL IF NOT EXISTS yasuhara_st_pool
    MIN_NODES = 1
    MAX_NODES = 1
    INSTANCE_FAMILY = CPU_X64_XS;

-- 外部アクセス統合の作成
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION yasuhara_pypi_external_access_int
    ALLOWED_NETWORK_RULES = (snowflake.external_access.pypi_rule)
    ENABLED = TRUE;

-- 開発用ロールへの権限付与
GRANT USAGE ON INTEGRATION yasuhara_pypi_external_access_int TO ROLE yasuhara_st_creator;
GRANT USAGE, MONITOR, OPERATE ON COMPUTE POOL yasuhara_st_pool TO ROLE yasuhara_st_creator;

ローカル環境での開発

プロジェクトディレクトリの作成

以下の手順で、プロジェクト用ディレクトリと仮想環境(venv)を用意しました。Streamlit in Snowflake のコンテナランタイム(Python 3.11)に合わせるため、ローカルも Python 3.11 を使用しています。

mkdir my_sis_app
cd ./my_sis_app

# 仮想環境の作成
uv venv .venv
source .venv/bin/activate

$ python --version
Python 3.11.9

pyproject.toml を作成

pyproject.toml を作成し、依存関係を定義します。

code pyproject.toml

pyproject.tomlは、ユーザーが明示的に用意しない場合でも、GUI 経由などの Streamlit in Snowflake のデプロイ過程で雛形が生成・配置されていました。今回はその雛形をベースに、ローカル開発でも同じ依存関係になるように、同内容をプロジェクト直下に作成して利用しました。

pyproject.toml
[project]
name = "yasuhara-streamlit-app"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
  "streamlit[snowflake]",
  "snowflake-snowpark-python"
]

[tool.uv]
constraint-dependencies = ["numba>=0.56.0"]

依存関係をインストールします。

uv pip install -e .

ローカルからの接続設定

ローカルで st.connection("snowflake") を動作させるために、Streamlit の secrets ファイルを用意します。

mkdir .streamlit
mkdir .keys # 鍵を配置
code .streamlit/secrets.toml

接続設定は以下のようにしました。

.streamlit/secrets.toml
[connections.snowflake]
account = "<アカウント>-<組織>"
user = "<Snowflakeのユーザー名>"
authenticator = "SNOWFLAKE_JWT"
private_key_file = "./.keys/<rsa key>.p8"
role = "yasuhara_st_creator"
warehouse = "X_SMALL_WH"
database = "yasuhara_st_db"
schema = "app"

Git 管理する場合は、これらは除くようにします。

https://docs.snowflake.com/en/developer-guide/streamlit/app-development/secrets-and-configuration#managing-your-connection-to-snowflake

アプリの作成

Snowflake に接続できることを確認したかったので、最小の Streamlit アプリとして作成しています。

code streamlit_app.py

streamlit_app.py は以下のように実装しました。

streamlit_app.py
import streamlit as st

st.title("コンテナランタイムのローカルからの開発テスト")

# Snowflakeへの接続(ローカルでは .streamlit/secrets.toml の [connections.snowflake] を使う)
st.subheader("Snowflake session check")
conn = st.connection("snowflake")
session = conn.session()

row = session.sql("""
select
  current_account() as acct,
  current_user() as usr,
  current_role() as role,
  current_timestamp() as ts
""").collect()[0]

st.json(row.as_dict())

特徴として、st.connection("snowflake") は、実行環境によって Snowflake への接続方法が以下のように変わります。

  • ローカル実行時
    • .streamlit/secrets.toml に定義した接続情報を使って Snowflake にログインします
  • SiS 上で実行する場合
    • アプリは Snowflake 内の実行環境(コンテナランタイム)で動作し、st.connection("snowflake") はローカルの secrets を参照しません
    • この際、少なくとも権限(ロール)はアプリ所有者側のロールとなります
    • 後述しますが、ユーザー情報も今回(コンテナランタイム)の場合、Streamlit 実行用のサービスユーザーのように見える値が表示されました

https://docs.streamlit.io/develop/api-reference/connections/st.connections.snowflakeconnection

ローカルでアプリを実行します。

streamlit run streamlit_app.py

ブラウザ経由で確認すると下図のようになっており、対応するコンテキストが表示されました。

image

Snowflake CLI 用の接続設定

Streamlit ローカル実行用(.streamlit/secrets.toml)とは別に、Snowflake CLI が参照する接続設定ファイルを作成します。

code snowcli.toml

こちらの内容は以下のようにしました。

snowcli.toml
default_connection_name = "dev"

[connections.dev]
account = "<アカウント>-<組織>"
user = "<Snowflakeのユーザー名>"
authenticator = "SNOWFLAKE_JWT"
private_key_file = "./.keys/rsa_key.p8"
role = "yasuhara_st_creator"
warehouse = "X_SMALL_WH"
database = "yasuhara_st_db"
schema = "app"

接続確認は以下で実行します。

snow --config-file ./snowcli.toml connection test

Snowflake CLI のプロジェクト定義ファイル(snowflake.yml)を作成

Snowflake CLI がデプロイ時に参照するプロジェクト定義ファイル(snowflake.yml)を作成します。

code snowflake.yml

内容は以下のようにしました。

snowflake.yml
definition_version: 2

entities:
  yasuhara_streamlit:
    type: streamlit

    identifier:
      name: yasuhara_streamlit_app
      database: yasuhara_st_db
      schema: app

    runtime_name: SYSTEM$ST_CONTAINER_RUNTIME_PY3_11
    compute_pool: yasuhara_st_pool
    query_warehouse: x_small_wh
    main_file: streamlit_app.py

    external_access_integrations:
      - yasuhara_pypi_external_access_int

    artifacts:
      - streamlit_app.py
      - pyproject.toml

こちらの内容は以下が参考になります。

https://docs.snowflake.com/en/developer-guide/snowflake-cli/streamlit-apps/manage-apps/initialize-app

nameで指定の名称で Snowflake 上に Streamlit オブジェクトとして作成されます。また、runtime_name/compute_pool/query_warehouseを指定することで、コンテナランタイムかつ指定のコンピュートプールやクエリ用ウェアハウスを利用する設定となります。

各パラメータの詳細は実際の CREATE 文から確認できます。

https://docs.snowflake.com/en/en/sql-reference/sql/create-streamlit#label-create-streamlit-optional-parameters

ローカルからデプロイ

Snowflake CLI を使って Streamlit アプリをデプロイします。

snow --config-file ./snowcli.toml streamlit deploy yasuhara_streamlit

https://docs.snowflake.com/en/developer-guide/snowflake-cli/command-reference/streamlit-commands/deploy

問題なく実行できると、Snowflake 上でも指定のデータベース・スキーマに Streamlit オブジェクトが作成されていることを確認できます。

image 1

実行すると下図のようになっていました。

image 2

特にユーザーについて、ローカル実行時は.streamlit/secrets.tomlに記載の開発用ユーザーで Snowflake にログインしているため、current_user() はその開発用ユーザーとなっていました。

SiS上で実行した場合は、アプリは Snowflake 管理の実行環境(コンテナランタイム)で動作するため、st.connection("snowflake") はローカルの接続情報ではなく Snowflake 側で提供されるコンテキストを利用している様子が伺えます。

パッケージの追加

一通り基本的な操作を確認できたので、最後に PyPI 経由で外部パッケージを追加してみます。今回は例として日時ライブラリの pendulum を利用しました

pyproject.toml を更新

dependenciespendulum を追加します。

pyproject.toml
[project]
name = "yasuhara-streamlit-app"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
  "streamlit[snowflake]",
  "snowflake-snowpark-python",
  "pendulum>=3.0.0"
]

[tool.uv]
constraint-dependencies = ["numba>=0.56.0"]

アプリを更新

以下のようにアプリを更新しました。

streamlit_app.py
import streamlit as st
import pendulum

st.title("コンテナランタイムのローカルからの開発テスト")

st.subheader("PyPI package test: pendulum")

st.write("Now (Tokyo):", pendulum.now("Asia/Tokyo").to_iso8601_string())

# Snowflake接続確認(ローカルでは .streamlit/secrets.toml の [connections.snowflake] を使う)
st.subheader("Snowflake session check")
conn = st.connection("snowflake")
session = conn.session()

row = session.sql("""
select
  current_account() as acct,
  current_user() as usr,
  current_role() as role,
  current_timestamp() as ts
""").collect()[0]

st.json(row.as_dict())

ローカルで動作確認

uv pip install -e .
streamlit run streamlit_app.py

ブラウザ上で Now (Tokyo) が表示され、外部パッケージの追加を確認できます。

2026-01-08_21h44_13

Snowflake にデプロイ(Snowflake CLI)

ローカルで動作確認ができたら、Snowflake CLI でデプロイします。--replaceオプションを指定することで、既存の Streamlit オブジェクトがある場合は上書きされます。

snow --config-file ./snowcli.toml streamlit deploy yasuhara_streamlit --replace

デプロイ成功後、Snowsight 上から確認すると、アプリが更新されていることを確認できました。

image 4

さいごに

Snowflake CLI からコンテナランタイムを使用する Streamlit オブジェクトのデプロイ試してみました。Github Actions 経由でも今後試してみたいと思いました。
本記事の内容がどなたかの参考になれば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事