streamlit on snowflake 開発での学び
概要
Streamlit on Snowflake 開発でハマったことや学んだことをメモします。
同じ問題で悩んでいる方の参考になれば幸いです。
streamlit アプリから、インターネットへ出られない
問題の概要
Snowflake 上の Streamlit アプリから requests
を使用して外部へ通信を試みると、 名前解決エラーが発生する。
ドメインネームではなく IPアドレス で通信を試みると、到達不能エラーが発生する。
原因
Snowflake 上の Streamlit が外部と通信するためには、別途設定が必要。
これを行わなかったため、外部と通信が出来なかった。
対応策
外部と通信するための設定を行う。
EXTERNAL_ACCESS_INTEGRATIONS
リソースを作成し、これを create (or replace)streamlit
コマンド実行時に指定する。
Snowflake 上の Streamlit 開発画面から遷移できる、 Streamlit の設定画面からも external_access を設定できる。
詳細は、以下公式ドキュメントを参照。
Python のバージョンが高すぎると、 snowflake ライブラリのバージョンが極端に下がる
問題の概要
snowflake
というライブラリを使用すると、 Python スクリプトから Snowflake を操作できる。
pip install snowflake
この時、 Python のバージョンが高すぎると、非常に低い snowflake バージョンしか使用できない。
python 3.12 系で、 snowflake==0.0.4
を確認。
python 3.10 系で、 snowflake==1.5.0
を確認。
- 1.5.0 は、記事執筆時点(2025/05/18)の最新バージョン
原因
snowflake
ライブラリ(またはその依存ライブラリ)が、最新の python バージョンに対応していないものと思われる。
対応策
python のバージョンを 3.10 系に落とす。
他にも、インストールするライブラリを変更する事でも対応可能。
例1)Snowflake と接続する場合は snowflake-connector-python
pip install snowflake-connector-python
例2) Snowpark 系を操作する場合は snowflake-snowpark-python
pip install snowflake-snowpark-python
など。
ライブラリを変更する場合、 snowflake
ライブラリは削除すること。
pip uninstall snowflake
以下公式ドキュメントも併せて参照。
- https://docs.snowflake.com/ja/developer-guide/python-connector/python-connector
- https://docs.snowflake.com/ja/developer-guide/snowpark/python/index
Streamlit 上で、一部 Snowflake SQL が使用できない
問題の概要
Streamlit 上の Pythonコードで、一部 Snowflake の機能が使用できない。
以下について、使用できない事を確認。
- ロール、DB、スキーマ変更系の関数
-
EXECUTE JOB SERVICE
SQL
from snowflake.snowpark.context import get_active_session
session = get_active_session()
# session.use_role('your_db_name') # unsupported
# session.use_database('your_db_name') # unsupported
# session.use_schema('your_db_name') # unsupported
execute_job_service_sql = """
EXECUTE JOB SERVICE ...
"""
# session.sql(execute_job_service_sql) # error
原因
EXECUTE JOB SERVICE
が失敗する正確な理由は不明。
少なくとも、 Streamlit 上で直接実行できる SQL に、制約があることは間違いない。
対応策
Streamlit から 呼び出せないSQL は、 Snowflake TASK や、 ストアドプロシージャ経由で呼び出すようにする。
ストアドプロシージャを経由する例を示す。
create procedure execute_job_service_procedure()
...
as
$$
begin
execute job service ...
end;
$$;
ストアドプロシージャの中で、 streamlit から直接実行できないSQL(ここでは execute job service)を実行する。
後は、streamlit 側で、上記ストアドプロシージャを呼び出す。
session = get_active_session()
call_procedure_sql = "call execute_job_service_procedure()"
session.sql(call_procedure_sql)
複数のstreamlitアプリを、一つのステージに集約したい
やりたいこと
権限等の制約で、ステージを自由に増やせない環境を想定。
開発した複数の streamlit アプリケーションのデプロイ先を、一つのステージに集約したい。
ステージは一つに集約するが、 Snowflake での streamlit アプリは独立して存在させ、編集・開発できること。
対応策
From句にて、ステージを指定する後に、ファイルシステムのようにサブディレクトリを記載できる。
create or replace streamlit your_streamlit_app
from @your_db.your_schema.your_stage/app1_dir -- your_stage ステージの /app1_dir ディレクトリをルートに指定
...
アプリケーション別に保存先のサブディレクトリを変更する事で、ソースコードを独立してステージに保存できる。
実践例・図解
上記図のように、ステージを共有しつつ Snowflake 上に Streamlit アプリを三つ作成できる。
各 Streamlit アプリは、Snowflake上で独立して開発・運用できる。
Discussion