Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Streamlit ホスティング基盤をスケールさせる

GO Inc. dev
September 20, 2024
6

Streamlit ホスティング基盤をスケールさせる

GO TechTalk #29 タクシーアプリ『GO』のログ解析の民主化を促進するStreamlitの活用 で発表した資料です。

■ YouTube
https://www.youtube.com/watch?v=vcE70wYfrOA

■ connpass
https://jtx.connpass.com/event/328998/

GO Inc. dev

September 20, 2024
Tweet

More Decks by GO Inc. dev

Transcript

  1. © GO Inc. プロフィール写真 正方形にトリミングした写 真を「図形に合わせてトリ ミング」で円形にすると真 円になる 2 自己紹介

    GO株式会社 ソフトウェアエンジニア / 按田 勝彦 • AI技術開発部データプラットフォームグループ所属 • タクシーアプリ『GO』における分析基盤・アルゴリズム基盤の開発 ・運用を担当 • 所属している部活は料理技能向上部 「ていねいな暮らし」を心がけています
  2. © GO Inc. 6 背景 • より、ニーズに叶った分析結果の共有を実現するため、Streamlitア プリケーションのホスティング基盤が構想された • ホスティング基盤は、アナリスト毎に専用のStreamlitサイトを割り

    当てる、いわゆるマルチテナントアーキテクチャを採用し、データ ソースであるBigQueryとの接続性やカスタマイズ性を鑑みて、 GKE(k8s)上に構築することとなった • 初期リリース時はアジリティ優先で構築し、アナリストには好意的に 受け止められ、利用者が急増した • 利用者急増にともない、マルチテナント特有の運用課題が浮上した。 また、監査ログが取れていないという問題も明らかになった。
  3. © GO Inc. 7 課題1 - デプロイ マルチテナントは、同じようなアプリケーションを一つの基盤でホス ティングする。初期段階のシンプルな実装では、主にデリバリー観点で 下記が問題となっていた。

    • デプロイ工程に人手が介在しており手順が煩雑であった ◦ CI/CDパイプラインやk8sマニフェストをアプリケーションごと にコピー・編集して用意しなければならない ◦ k8sマニフェストの環境差分も人手で管理している このことが、アナリスト毎のStreamlit環境を払い出しする際のリードタ イムを遅延させていた。さらに、保守メンバーが固定化することも危惧 されていた。
  4. © GO Inc. 8 課題2 - ロギング また、監査目的で • 「誰が」

    • 「どのStreamlit環境に」 • 「いつアクセスしたのか?」 というロギングについても必要となった。 確実性を求められるにもかかわらず、アナリストにロギングの実装を強 制できないので、ホスティング基盤側で対応せざるをえなくなった。
  5. © GO Inc. 10 対策 これらの課題に対して以下の取り組みを行った。 • 課題1 - デプロイに対する対策

    ◦ CI/CDパイプラインの共通化 ◦ GitOpsの実現 ▪ k8sマニフェストのテンプレート化 ▪ ArgoCDの導入 • 課題2 - ロギングに対する対策 ◦ Pythonメタプログラミングによるロギング
  6. © GO Inc. 11 対策 - CI/CDパイプラインの共通化 Before • Github

    Actionsでアナリストごとに個別のCI/CDパイプラインを設定 していた • 更新したDockerイメージのデプロイまでこのパイプラインで行って いた(CIOps) After • CI/CDパイプラインを共通化して「アナリスト名+アプリ名」をパラ メータとして渡すようにした👍 ◦ パラメータはgh pr diffの結果から自動的に抽出 ▪ 日本語ファイル名の取り扱いに不具合があったので、修正をコント リビュートした! https://github.com/cli/cli/pull/9115 • Dockerイメージのレジストリ登録までを責務とした(GitOps)
  7. © GO Inc. 12 対策 - (GitOps) k8sマニフェストのテンプレート化 Before •

    各アプリケーションごとに個別のマニフェストを用意していた • それぞれのアプリケーションに特化した設定は個別に編集していた After • リストに「アナリスト名+アプリ名」を登録するだけでマニフェスト を用意できるようにした👍 ◦ 「アナリスト名+アプリ名」を引数として受け取る共通のテンプ レートを作成した ◦ kustomizeとyttを用いて、リストとテンプレートからマニフェ ストをレンダリングするようにした ▪ それぞれのアプリケーションに特化した設定はオーバーレイ で実現した
  8. © GO Inc. 13 対策 - (GitOps) ArgoCDの導入 Before •

    k8sマニフェストの環境差分を人手で管理していた ◦ マニフェストをGitで管理はしているが適用はkubectl applyで手 動実行 After • ArgoCDを導入し、マニフェストの環境差分を自律的に解決できるよ うにした👍 • あわせて、ArgoCD Image updatorを導入し、イメージ更新をトリ ガーとして自動でデプロイされるようにした👍 • さらに、Reloaderを導入し、ConfigMap変更時にPodが自動的に再起 動されるようにした👍
  9. © GO Inc. 14 対策 - Pythonメタプログラミングによるロギング BigQuery 分析 データ

    ・ ・ ・ コンテナ実行環境 ロード バランサー Cloud Load Balancing 認証 Identity-Aware Proxy IP制限 Cloud Armor 閲覧者1 閲覧者2 閲覧者n ・ ・ ・ GCP分析環境 サイト1 サイトn リバース プロキシ イメージ リポジトリ 開発者 Before① • リバースプロキシでロギ ング ◦ WebSocket通信の ためコネクション確 立時しかイベントを 記録できない Before② • CI時に各アプリケーショ ンを強制的に書き換えて ロギングコードを注入 ◦ テキスト置換なので ちょっとした構造の 変化で破綻する ◦ エラーで報告される 行番号がずれる
  10. © GO Inc. 15 Appendix - そもそもメタプログラミングとは? メタプログラミング (英語: metaprogramming)

    [注釈 1]とはプログラミ ング技法の一種で、一般に「プログラムを記述するプログラム」を書く こと、またはそのプログラムを指す[1]。対象言語に埋め込まれたマクロ 言語によって行われることもある。 出典: フリー百科事典『ウィキペディア(Wikipedia)』 ↓ 今回の文脈では実行時にプログラムを書き換える手法という理解でOK👌
  11. © GO Inc. 16 Appendix - Pythonメタプログラミングの手法 ▪ Ghost Method

    ▪ Singular Method ▪ Monkey Patch ▪ Metaclass ▪ Decorator ▪ Descriptor ▪ Operator Overload ▪ eval/exec ▪ Dynamic Module ▪ ast ▪ Import Hook ▪ …etc 参考)https://tell-k.github.io/pyconjp2016/#1
  12. © GO Inc. 17 対策 - Pythonメタプログラミングによるロギング After • メタプログラミングの技法を用いてロギングコードを注入した👍

    ◦ Pythonインタープリタが起動する際に自動的に読み込まれるスクリプトでロギン グコードを注入(sitecustomize.py) ▪ Streamlitのページ表示イベントにロギング用デコレータを適用し、モン キーパッチで差し替え show() def show(): ... def trace(func): inner(): func() logger.info(log) return inner trace() show() 元の実装と 差し替え ページ表示 イベント ロギング機能 付加 show()
  13. © GO Inc. 20 振り返り • 🌞 Good / ⛅

    Motto ◦ 🌞 k8sのエコシステム活用により、ベストプラクティスに則った デリバリーの仕組みをローコストで導入することができた! ◦ 🌞 取り組みを通じてOSSコントリビュートができた! ◦ 🌞 解決策の共有を通じて、チームの問題解決能力が一段上がっ た! ◦ ⛅ ホスティング基盤の選定において、k8sだけでなく、よりシン プルなDokku(HerokuコンパチブルのPaaS OSS)なども、検討 対象にいれるべきだった…