📈

Google ColabとStreamlit on Cloud Runで高速ダッシュボード開発

2021/08/28に公開

Streamlitはデータ可視化用Webアプリケーションを簡単に作成できるPythonのフレームワークです。
https://streamlit.io/

ダッシュボードの作成と共有を効率化

Google ColabでStreamlitのコードを作成しながら都度Cloud Runでダッシュボードのプレビューができるようにする仕組みを考えたので紹介します。URLを伝えるだけで簡単にダッシュボードを共有できます。
以下、使用方法を説明します。

  1. ColabのセルにStreamlitのコードを入力して実行します。その際、マジックコマンドとして今回作成した%%streamlit_deployをセルの1行目に入力しておきます。

  2. 実行が完了したらセルの下部にリンク表示されるのでクリックするとStreamlitで作成したダッシュボードが別タブで表示されます。

  3. 今度は別のセルでBigQueryのデータにアクセスするダッシュボードを作成してみます。(Streamlitのサイトにあるexample codeです)

  4. こちらもリンクをクリックすると問題なく表示されています。

以上、簡単です。

Colab上で試行錯誤しながらすぐにプレビュー確認できるので、Googleデータポータルに近い使用感でありながらStreamlitによる柔軟な表現ができるようになるので便利だと思います。

仕組み

仕組みはとてもシンプルです。

  • StreamlitによるサービスはCloud Runにデプロイして実行しています。
  • Cloud RunへのデプロイはIPythonマジックコマンドとして実装されています。

%%streamlit_deployコマンド

https://github.com/koji-m/streamlit-magic

%%streamlit_deployコマンドが裏で何をやっているか説明します。
セルの1行目にマジックコマンドとして%%streamlit_deploy <サービス名>と書いて、2行目以降にStreamlitのコードを入力しておくと、セル実行時にコードがGoogle Cloud Storageに保存されます。そして、マジックコマンドの引数に指定したサービス名のCloud Runサービスを作成します。
このCloud Runサービスでは、先に保存したStreamlitのコードをGCSから取得してstreamlit run <streamlitファイル>コマンドでサービスを起動しています。
したがって、1つのStreamlitコード(セル)ごとに1つのCloud Runサービスが作成されます。

コードを更新した時の挙動

同じCloud Runサービス名のコード(つまり実行済みセルのコード)を変更して再度セルを実行した場合は、既存のCloud Runサービスを削除して再度作り直します。
GCS上のコードを更新するだけで良いように思えますが、その場合Cloud Runのサービスは古いコードでしばらく起動し続けているので、アイドル状態が続いてコンテナがシャットダウンして再起動するまで新しいコードは反映されません。
新しいコードが反映されるまで待つのは開発体験的に良くないので、即時更新を反映させるために全く新しいCloud Runサービスを作成して古いサービスと入れ替えるという方法をとりました。

補足

%%streamlit_deployを使用するためには事前に準備が必要になるので補足しておきます。

Cloud Runで使うコンテナイメージの準備

上記リポジトリのdocker/ディレクトリにCloud Runで使うコンテナイメージのDockerfileがあります。
https://github.com/koji-m/streamlit-magic/tree/master/docker
GCSへのファイル保存とStreamlit実行時に使用するGCP IAMのクレデンシャルファイルを事前に作成しておいて、secrets/ディレクトリにkey.jsonというファイル名で保存しておきます。(参考: https://cloud.google.com/iam/docs/creating-managing-service-account-keys?hl=ja)
そして、DockerfileがあるディレクトリでCloud Buildを使用してGoogle Container Registryにコンテナイメージを登録します。

gcloud builds submit --tag gcr.io/<プロジェクト名>/<イメージ名>:latest

Colabでの初期設定

Colab側でもマジックコマンドを使用できるようにパッケージのインストールと初期設定が必要になります。以下の内容をColab上で最初に実行しておきます。

GCPへの認証

from google.colab import auth
auth.authenticate_user()

マジックコマンドのインストール

!pip install git+https://github.com/koji-m/streamlit-magic

マジックコマンドのロード

%load_ext streamlit_magic

マジックコマンドの初期設定

%%streamlit_config
{
  "project_id": "<プロジェクト名>",
  "bucket_name": "<GCSバケット名>",
  "image_name": "<コンテナイメージ名>"
}

最後に

現状、このマジックコマンドでデプロイされるCloud RunのサービスへのアクセスはIAMによる認証が必要になります。IAMを適切に管理すれば組織内だけでダッシュボードを共有することもできます。また、デプロイ先をGCP以外に指定できるとより利用の幅が広がりそうです。

Discussion