❄️

snow streamlit deploy で Streamlit アプリをデプロイするとマルチページを利用できない

に公開

概要

Snowflake 上で Streamlit アプリケーションをデプロイする際、 snow streamlit deploy コマンドを使用すると、マルチページ機能が利用できないという制約があります。

本記事では、この問題の原因を考察し、 create or replace streamlit コマンドを用いた回避策を紹介します。また、ROOT_LOCATION を使用した場合のその他の制約についても触れ、効率的なデプロイ方法を提案します。

結論

snow streamlit deploy --replace コマンドでデプロイ後 FROM 句を使用した create or replace streamlit SQLを実行します。

Snowflake CLI を活用したデプロイの基本情報

作成した Streamlit アプリケーションを Snowflake へデプロイできる、 snow コマンドが存在します。

snow streamlit deploy --replace

コマンドの詳細は、以下公式ドキュメントをご参照ください。

snow コマンドは、 pip install で導入できます。

pip install snowflake-cli

このデプロイコマンドを使用すると、開発した Streamlit アプリケーションを、設定ファイルである snowflake.yml に従って、Snowflake へデプロイしてくれます。

まとめると、以下の流れとなります。

  1. snowflake-cli を導入
  2. streamlit アプリケーションを開発
  3. snowflake.yml を作成
    • 必要に応じて environment.yml を作成
  4. snow streamlit deploy --replace コマンドでデプロイ

snowflake.yml については、以下公式ドキュメントをご参照ください。

コマンド一つでデプロイできて非常に便利なのですが、 snow streamlit deploy でデプロイすると、 マルチページ機能が使用できなくなる という問題が発生します。

マルチページ機能が使用できなくなる理由

公式ドキュメントにて、マルチページが機能しなくなるケースについて注意書きがあります。

Streamlit を動作させるためには、DB,スキーマ、ステージの指定が必要です。
これらを指定する方法に、以下二つがあります。

  • FROM 句による指定
  • ROOT_LOCATION による指定

そして、 ROOT_LOCATION を使用した場合、 マルチページ機能が使用できなくなります。

回避策

初めに、 snow streamlit deploy コマンドで Streamlit アプリケーションをデプロイします。

snow streamlit deploy --replace

その後、デプロイしたアプリケーションに対して create or replace streamlit コマンドを実行し、 FROM 句を使用した設定で上書きします。

update_streamlit_sql="""
create or replace streamlit your_streamlit_app_name
   from '@your_db.your_schema.your_stage'
   main_file = 'your_main_file.py'
   query_warehouse = 'your_warehouse';
"""

snow sql -q ${update_streamlit_sql}

これで、 Snowflake 上の Streamlit にて、マルチページ機能が使用できるようになります。

上記コマンドをまとめてスクリプト化しておくことで、コマンド一発でデプロイできるようになります。

deploy.sh
#!/bin/bash

set -eu

# Streamlit アプリケーションを Snowflake へデプロイ
snow streamlit deploy --replace

# FROM 句を用いた設定で上書きする
update_streamlit_sql="""
create or replace streamlit your_streamlit_app_name
   from '@your_db.your_schema.your_stage'
   main_file = 'your_main_file.py'
   query_warehouse = 'your_warehouse';
"""

snow sql -q ${update_streamlit_sql}

余談 : ROOT_LOCATION の使用で発生する、他の制約

ROOT_LOCATION の使用では Streamlit のマルチページ機能が使用できなくなる事に加え、以下の制約が発生します。

  • Git 連携機能が使用できない
  • ファイル選択用のペインが使用できない

◆Git 連携機能が使用できない

Git 連携ボタンがグレーアウトされ、選択できなくなります。

◆ファイル選択用のペインが使用できない

VSCode のようなファイル編集ペインが表示されず、設定ファイル (environment.yml など) の編集やデバッグが困難になります。

参考文献

Discussion