StreamlitでWebアプリを開発した場合、同社の提供するクラウド型公開サービス”Streamlit Community Cloud”を利用することで、非常に簡単にアプリをデプロイすることが可能です。 スムーズにいけば、初めての場合でも準備も含めて10分程度で公開させることができます。
ただし、 Streamlit Community Cloudのデプロイ時にパッケージの依存関係でつまづく場合 に記載したとおり、Streamlit Community Cloudは可用性に疑問があります。
手早く公開できる点は非常に大きなメリットですが、サービスとして公開させたい場合や安定稼働させたい場合には、自前でVPSや各種クラウドサービス上にStreamliをデプロイさせていく方が良さそうです。
目次:
- Streamlit Community Cloudへの登録(早めに)
- 利用するライブラリのリストを用意する(requirements.txtなど)
- パッケージマネージャーごとに異なる方法で、ライブラリの依存関係を明記する
- requirements.txtの書き方
- ryeの場合はrequirements.lockをrequirements.txtとしてコピーする
- 環境変数やデータベース接続情報などをSecretsで登録
- Streamlit Cloud上で用いる場合はSecretsの設定項目内で設定
- ローカルでSecrets情報を用いたい場合には、secrets.tomlを作成する
- ユーザーIDやパスワードを設定する
- 公開させるGitHubのブランチを選択してStreamlit Community Cloudで公開
- 公開したWebアプリへのアクセスが少ない場合、一定期間で自動的にアプリがスリープ状態になる
Streamlit Community Cloudへの登録(早めに)
まず、まだStreamlit Community Cloudへ登録していない場合は登録申請をしましょう。利用可能となるまで、申請してから2営業日ほどかかる場合があります。早めに登録申請しておきましょう。
利用するライブラリのリストを用意する(requirements.txtなど)
パッケージマネージャーごとに異なる方法で、ライブラリの依存関係を明記する
requirements.txt : 公開するアプリケーションで利用している外部ライブラリを記載するもの。パッケージマネージャーがpipである場合。
condaの場合にはenvironment.yml、pipenvの場合にはPipfileなど、パッケージマネージャーごとに用意する書式が異なります。
requirements.txtの書き方
Requirements Files | User Guide - pip documentation v23.1.2
requirements.txtに記載がないと、Streamlitが外部ライブラリをうまく把握できず、デプロイの際に不具合が生じることがあります。
開発環境にインストールされたライブラリをすべてそのままデプロイ時にも利用する場合には、下記コマンドでrequirements.txtへ出力すれば良いでしょう。
$ pip3 freeze > requirements.txt
他にも公開環境で使わないライブラリをインストールしている場合には、下記コマンドで出力されたライブラリとバージョンを見ながら、手動でrequirements.txtを作成していきます。
$ pip3 freeze
requirements.txtには、外部ライブラリ「のみ」をrequirements.txtに記載します。
Streamlit自体も外部ライブラリとなるので、記載が必要となります。
Numpy, Pandas等を利用する場合も記載が必要
記載しなくて良いライブラリとして、たとえば、timeライブラリはもともとPythonに入っている標準ライブラリなのでrequirements.txtには記載不要です。
requirements.txtの作成の際、バージョンを指定して併記するのがベター。
requirements.txtへの記載例。
streamlit==0.87.0
バージョンを記載しない場合には、最新版が公開アプリにインストールされます。
streamlit
ryeの場合はrequirements.lockをrequirements.txtとしてコピーする
Community Cloudはrequirements.txtがあるとそれを使って依存を解決してくれる。 Ryeのロックファイルであるrequirements.lockはrequirements.txtと互換性がある形式なので、シンボリックリンクを貼る。
Streamlit Community CloudにRyeのアプリをデプロイする
自分の場合はシンプルにrequirements.lockの内容をコピーして、新規にrequirements.txtを作成しました。
ただし、requirements.lockの先頭行には-e file:.の記載がされますが、requirements.txtには-e file:.の記載は消しておいたほうが良いでしょう。
環境変数やデータベース接続情報などをSecretsで登録
Streamlit Cloud上で用いる場合はSecretsの設定項目内で設定
APIキーなどの環境変数やデータベース接続情報をStreamlit Cloudで用いたい場合、”Secrets”と呼ばれるStreamlit Cloud設定項目内で変数として格納してあげる必要があります。
Secrets management - Streamlit Docs
機密情報をハードコーディングして公開するのは、セキュリティリスクが大きいため絶対に避けましょう。Secrets項目で格納し、アプリ内で呼び出すようにします。
# Everything in this section will be available as an environment variable
db_username = "Jane"
db_password = "12345qwerty"
# You can also add other sections if you like.
# The contents of sections as shown below will not become environment variables,
# but they'll be easily accessible from within Streamlit anyway as we show
# later in this doc.
[my_cool_secrets]
things_i_like = ["Streamlit", "Python"]
Secrets management - Streamlit Docs
Secretsにおいては、TOML形式と呼ばれる形式で入力する必要があります。
あまり気にせず、通常どおり変数を格納するつもりで書いていけば良いでしょう。
ただし、文字列は必ずクオートで囲ってあげる必要があります。
# OK
YOUR_VALID_KEY = "abcdefg"
# NG
YOUR_INVALID_KEY = abcdefg
Secretsへ保存した変数は、st.secrets[’key’]のように辞書形式で呼び出すことができるほか、os.environ[’key’]としてOS環境変数のように扱って呼び出すことが可能です。
os.environ[’key’] を利用すれば、ローカル環境と公開環境でSecretsを呼び出す際に、コードを変更することなく共通の書き方を利用することができます。
import streamlit as st
# Everything is accessible via the st.secrets dict:
st.write("DB username:", st.secrets["db_username"])
st.write("DB password:", st.secrets["db_password"])
st.write("My cool secrets:", st.secrets["my_cool_secrets"]["things_i_like"])
# And the root-level secrets are also accessible as environment variables:
import os
st.write(
"Has environment variables been set:",
os.environ["db_username"] == st.secrets["db_username"],
)
Secrets management - Streamlit Docs
または、以下で説明するようにローカル環境下にてsecrets.tomlファイルをあらかじめ用意するようにしておきましょう。
ローカルでSecrets情報を用いたい場合には、secrets.tomlを作成する
ローカル環境でst.secretsのようにしてSecrets情報を用いたい場合には、別途secrets.tomlをファイルとして作成する必要があります。
また、このsecrets.tomlは.streamlitフォルダの中に格納されている必要があります。
Secrets management - Streamlit Docs
上画像での警告があるとおり、ローカルでsecrets.tomlを作成する場合、誤ってGit上で追加・公開されてしまう危険性があります。予防のために .gitignoreファイルで除外設定をしておきましょう。
また注意として、secrets.tomlファイルとStreamlit Community Cloud管理画面のそれぞれで、同じ変数を宣言しないようにしましょう。あわせて2回同じ変数が定義されることになってしまい、エラーとなってしまうようです。
参考タグ: Git
ユーザーIDやパスワードを設定する
一般公開せずに自社や特定のグループ内でのみ利用したい場合、パスワードのみの設定(グローバルパスワード)またはユーザーIDを用意し、ユーザーごとにパスワードを設定するなどを行い、権限管理を行います。
ユーザーIDおよびパスワードについても、同様に”Secrets”設定で管理することができます。チェックについては、別途ファイル内に認証のための関数を記述する必要があります。
サンプルコード含めて手順は Authentication without SSO - Streamlit Docs に記載がありますので、こちらを参考に実装しましょう。
公開させるGitHubのブランチを選択してStreamlit Community Cloudで公開
上記までが準備できたら、Streamlitで公開させるGitHubのブランチおよびメインファイルのパスを選択するだけで公開が可能となります。
デプロイ時につまづいて、ずっとYour app is in the oven…となる場合には、パッケージの依存関係などで止まっている可能性があります。
私はYouTube Data APIを用いたWebアプリのGitHubリポジトリ・ブランチをStreamlit Community Cloudで公開しました。
YouTube Data APIを用いてカスタム検索を行うアプリケーションです。一般公開ではなく特定の取引先様のみが業務で利用するものだったので、さくっとStreamlitで実装、Streamlit Community Cloudで公開しました。
公開したWebアプリへのアクセスが少ない場合、一定期間で自動的にアプリがスリープ状態になる
公開したWebアプリへのアクセスが少ない場合、一定期間で自動的にアプリがスリープ状態になってしまうので注意してください。
スリープ状態となったWebアプリは、メールで通知がくるほか、ログイン後のダッシュボード画面で下記のようにスリープマークが表示されます。
ダッシュボードからアプリにアクセスし、Awakenボタンを押して再度ビルド処理を行うことで、再度公開状態に戻すことが可能です。
以前は管理画面・ダッシュボードからしか再起動させることができませんでしたが、現在では公開先にも”Awaken”ボタンが表示されるようになりました。開発者自身でなくても、公開先からアプリをスリープ状態から復帰させることが可能です。
アクセス状態に関わらず常にWebアプリを公開状態・スリープなしの状態とさせたい場合には、有料プランへの加入が必要となるようです。
It's not possible to keep Streamlit apps awake at all times if they're hosted on Streamlit Community Cloud. If you need the app to be awake at all times regardless of traffic, I'd recommend looking into paid hosting options.
Streamlit app going to sleep due to less traffic - Stack Overflow
この記事の気になった箇所を読み返す:
- Streamlit Community Cloudへの登録(早めに)
- 利用するライブラリのリストを用意する(requirements.txtなど)
- パッケージマネージャーごとに異なる方法で、ライブラリの依存関係を明記する
- requirements.txtの書き方
- ryeの場合はrequirements.lockをrequirements.txtとしてコピーする
- 環境変数やデータベース接続情報などをSecretsで登録
- Streamlit Cloud上で用いる場合はSecretsの設定項目内で設定
- ローカルでSecrets情報を用いたい場合には、secrets.tomlを作成する
- ユーザーIDやパスワードを設定する
- 公開させるGitHubのブランチを選択してStreamlit Community Cloudで公開
- 公開したWebアプリへのアクセスが少ない場合、一定期間で自動的にアプリがスリープ状態になる
Category: 開発・プログラミング | エンジニアリング