Streamlit in Snowflakeの開発環境を整備して初めてのアプリケーションを実装した話

はじめに

Streamlit in Snowflakeの開発を開始するには、Snowflakeアカウント、適切なIDE設定、ローカル開発環境の構築といった複数のステップが必要。この記事では、前提条件の確認、アプリケーション実装といった標準的なセットアップ手順をまとめる。

前提条件と必須の準備作業

Streamlit in Snowflakeの開発を始める前に、複数の前提条件を満たす必要がある。

前提条件の詳細:
  • Snowflakeアカウントへのアクセス – 有効なSnowflakeアカウントと、CREATE APPLICATION PACKAGE 権限を持つロールが必須である。ロール設計を行い、この権限を付与したカスタムロールを使用する
  • Pythonの開発環境 – Python 3.8以上がインストールされており、pipやcondaといったパッケージ管理ツールが動作する状態が前提である。Streamlit in SnowflakeはPython 3.10以上での動作を推奨している
  • Snowparkライブラリ – ローカル開発環境にsnowpark、snowflake-snowpark-python といったパッケージをインストール済みであることが必須
  • Snowflake CLIツール – Snowflake提供の公式CLIツール(snow)をシステムに導入する必要がある。このツールを通じてSnowflakeを対話的に操作する
  • 認証情報の管理 – ローカル開発では、Snowflakeへの接続情報をコードに埋め込まないことが重要である。環境変数、~/.snowsql/config ファイル、またはキーペア認証を使用して管理する。本番環境へのデプロイ時には、AWS Secrets ManagerAzure Key VaultHashiCorp Vaultといった外部認証サービスの利用が推奨される

IDE統合と開発環境の構築

Visual Studio Codeの統合により、ローカル開発フェーズ全体をエディタ内で完結させられる。Pythonコード編集ローカルテスト実行(`streamlit run` での動作確認)、Snowflakeへのクエリ検証デプロイまでの準備がVS Code内で実現される。一方、デプロイ後の本番環境ではSnowflakeウェブコンソール内でアプリケーションが動作する。公式のSnowflake拡張機能を利用することで、Snowflakeへの接続管理、SQL文の実行、デバッグが統一されたインターフェース内で実現される。

IDE統合のセットアップ手順:
  • Visual Studio CodeにSnowflake拡張機能をインストールする。拡張機能マーケットプレイスから「Snowflake」を検索し、公式のSnowflake Inc.提供版をインストールする
  • 拡張機能をインストール後、接続設定ファイル(通常は~/.snowsql/config)を確認し、接続情報が正確に記述されていることを検証する
  • コマンドパレット(Ctrl+Shift+P または Cmd+Shift+P)からSnowflakeの接続を確立する。接続テストが成功することで、Snowflakeへの通信が確認される
  • SQLエディタを開き、簡単なクエリ(例:SELECT CURRENT_USER())を実行してSnowflakeとの疎通確認を行う

IDE統合によって、ローカルでのPythonコード編集とSnowflakeのデータ参照が同一画面で実現され、開発の効率が劇的に向上する。

GitHub Codespacesでの開発も可能:

ローカルマシンの環境管理を避けたい場合、GitHub Codespacesを使用した開発も実用的に使用できる。CodespacesにおいてSnowflake拡張機能、Snowflake CLI、Streamlit CLIがサポートされている。`streamlit run` コマンドで起動したアプリケーションはCodespaces内で自動的にポート転送され、ブラウザプレビューが利用可能である。環境構築を.devcontainer/devcontainer.jsonで定義すれば、チーム全体で統一された開発環境を即座に立ち上げられる。

ローカル開発環境のセットアップ

ローカルマシンでStreamlit in Snowflakeアプリケーションを開発するには、複数のPythonパッケージが必要である。仮想環境の構築を通じて、プロジェクト固有の依存関係を隔離することが実務上の標準である。

開発環境の選択肢について:

Docker環境を用いてローカル開発環境を構築することも技術的には可能だが、本番環境がSnowflake内の管理コンテナ上で実行されるため、ローカルのDocker環境と本番環境の構成を統一することはできない。開発環境をDockerで隔離したとしても、本番デプロイ時には別の実行環境へ移行するため、Docker化による環境共通化のメリットは限定的である。仮想環境による環境隔離で十分であり、Docker導入による複雑さの増加は費用対効果が低い。チーム規模が大きく、開発環境の統一が重要な場合のみDocker化を検討する価値がある。


# 仮想環境を作成
python3 -m venv streamlit_env

# 仮想環境を有効化(macOS/Linux)
source streamlit_env/bin/activate

# 仮想環境を有効化(Windows)
streamlit_env\Scripts\activate

# 必須パッケージをインストール
pip install streamlit
pip install snowflake-snowpark-python
pip install snowflake-cli-labs

# requirements.txtを作成し、プロジェクトの依存関係を記録
pip freeze > requirements.txt

requirements.txtファイルの内容例:


streamlit==1.28.0
snowflake-snowpark-python==1.10.0
snowflake-cli-labs==2.0.0
pandas==2.0.0

仮想環境の隔離により、異なるプロジェクト間での依存パッケージの競合を回避できる。これは本番環境へのデプロイ時にも重要であり、requirements.txtはアプリケーションと共にSnowflakeにアップロードされる。

ローカルでの初期テストと動作確認

ローカル開発環境が構築されたら、Streamlitが正常に動作するか確認する必要がある。最小限のアプリケーションコードでSnowflakeへの接続テストを行う。


# app.py
import streamlit as st
from snowflake.snowpark.context import get_active_session

st.title("Streamlit in Snowflake - 初期テスト")

try:
    session = get_active_session()
    user = session.sql("SELECT CURRENT_USER()").collect()[0][0]
    st.success(f"Snowflakeへの接続成功。現在のユーザー: {user}")
except Exception as e:
    st.error(f"接続エラー: {str(e)}")

# 簡単なデータクエリ
if st.checkbox("テーブル一覧を表示"):
    try:
        databases = session.sql("SHOW DATABASES").collect()
        st.write(f"利用可能なデータベース数: {len(databases)}")
    except Exception as e:
        st.error(f"クエリ実行エラー: {str(e)}")

このテストアプリケーションを実行する場合、ローカルではStreamlit CLIでの実行が可能である。


streamlit run app.py

ただし、ローカルでの実行にはSnowflakeへの認証情報が必要である。環境変数で接続情報を提供する方法が一般的である。

必須の環境変数:
  • SNOWFLAKE_ACCOUNT – Snowflakeアカウント識別子(例:xy12345.us-east-1)
  • SNOWFLAKE_USER – ログインユーザー名
  • SNOWFLAKE_PASSWORD – ユーザーのパスワード(パスワード認証の場合)
  • SNOWFLAKE_WAREHOUSE – クエリ実行用のウェアハウス名
  • SNOWFLAKE_DATABASE – デフォルトのデータベース名
  • SNOWFLAKE_SCHEMA – デフォルトのスキーマ名

キーペア認証を用いる場合は、SNOWFLAKE_PASSWORD の代わりに SNOWFLAKE_PRIVATE_KEY_PATH と SNOWFLAKE_PRIVATE_KEY_PASSPHRASE を設定する。環境変数の設定例:


export SNOWFLAKE_ACCOUNT="xy12345.us-east-1"
export SNOWFLAKE_USER="developer_user"
export SNOWFLAKE_PASSWORD="your_secure_password"
export SNOWFLAKE_WAREHOUSE="dev_warehouse"
export SNOWFLAKE_DATABASE="analytics_db"
export SNOWFLAKE_SCHEMA="dev_schema"

# その後、streamlit run app.py を実行
streamlit run app.py

別の方法として、~/.snowsql/config ファイルに接続情報を記述し、Snowpark が自動的に読み込む設定も可能である。

初めてのアプリケーション実装

前提条件とローカル環境が整備されたら、Snowflakeアカウント内に実際のアプリケーションを作成する準備が整う。最小限のアプリケーションを実装し、Snowflakeへのデプロイが正常に機能することを確認する。

最小限のアプリケーション実装:

# app.py
import streamlit as st

st.title("初めてのアプリケーション")
st.write("Hello World.")

このシンプルな実装で、Streamlit in Snowflakeへのデプロイが正常に完了し、本番環境でUIが表示されることを確認できる。Snowflake側でアプリケーション作成用のステージとメタデータを準備する必要がある。


-- Snowflakeで実行:アプリケーション用のステージを作成
CREATE STAGE IF NOT EXISTS app_stage;

-- アプリケーション設定ファイルを準備
-- manifest.ymlを作成してステージにアップロード

Snowflake CLIを使用して、ローカルのアプリケーションコードをSnowflakeにデプロイする。


# Snowflake CLIでプロジェクトを初期化
snow project init

# ローカルの開発コードをSnowflakeにデプロイ
snow app deploy

デプロイ後の検証:

  • Snowflakeウェブコンソールにログインし、アプリケーション一覧から新規作成したアプリケーションが表示されていることを確認する
  • アプリケーションをクリックして開き、UIが正常に表示され、Snowflakeへのクエリが実行される状態を確認する
  • デプロイ後の最初の実行はコールドスタートのため、数秒の遅延が発生するが、以後のアクセスは高速化される

以下はエラーハンドリングを組み込んだ実装例。Snowflake環境において発生したネットワークエラー、タイムアウト、権限不足といった例外を補足し表示してみた。


# エラーハンドリングを含む実装例
import streamlit as st
from snowflake.snowpark.context import get_active_session

st.set_page_config(page_title="データダッシュボード", layout="wide")

try:
    session = get_active_session()
    
    st.header("データ参照アプリケーション")
    
    # ユーザー情報の取得
    current_user = session.sql("SELECT CURRENT_USER()").collect()[0][0]
    st.sidebar.write(f"ユーザー: {current_user}")
    
    # データベース選択
    db_list = session.sql("SHOW DATABASES").collect()
    databases = [row[1] for row in db_list]
    selected_db = st.selectbox("データベースを選択", databases)
    
    st.success(f"接続完了")
    
except Exception as e:
    st.error(f"エラーが発生しました: {type(e).__name__}")
    st.info("管理者に連絡してください")

まとめ

本記事では、前提条件の確認、IDE統合(Visual Studio Code、Snowflake拡張機能のセットアップ)、GitHub Codespacesでの開発環境構築の検討、ローカル開発環境の準備(仮想環境、パッケージインストール、Docker化の考慮を含む)について言及した。また、ローカルテスト実行時の環境変数設定方法についてまとめた。最後に、最小限のアプリケーションを実装し、Snowflakeへデプロイ後、動作確認を行なった。