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

Start Up Python #73 Introduction to streamlit and Deployment your app into Google Cloud

jumma.kudo
September 10, 2021

Start Up Python #73 Introduction to streamlit and Deployment your app into Google Cloud

jumma.kudo

September 10, 2021
Tweet

Other Decks in Technology

Transcript

  1. Copyright © 2021 Classi Corp. All Rights Reserved. • あなた誰


    • streamlit is 何
 • streamlit基本編
 ◦ Installation ~ どういうことができるんだっけ?(デモ) 
 ◦ App model, cache, and session state 
 ◦ どういう感じに使っているか
 • デプロイ編(GCP)
 ◦ Computing Architecture in GCP
 ◦ Google App Engine, Google Kubernetes Engine 
 ◦ Security
 • まとめ
 1 目次!

  2. Copyright © 2021 Classi Corp. All Rights Reserved. 工藤淳真(クドウジュンマ)
 2

    あなた誰?
 所属: Classi株式会社 データ/AI部 Pythonエンジニア 経歴: • 2016年~2020年 富士通株式会社 • 2020年~現在 Classi 今やってること: API開発・運用とクラウドインフラ周り、 GCPのセキュリティなど Python歴5年、最近GCPのProfessional Cloud Architect取りました! Twitter: @irisuinwl github: irisu-inwl blog: https://irisuinwl.ha tenablog.com/ 最近のマイブーム: • CPythonのコードリーディング • バーチャルの肉体を手に入れたのでそ れで遊んだりしてます
  3. Copyright © 2021 Classi Corp. All Rights Reserved. “The fastest

    way to build and share data apps Streamlit turns data scripts into shareable web apps in minutes. All in Python. All for free. No front‑end experience required.”
 cited from: https://streamlit.io/ 
 
 • データサイエンスwebアプリを簡単に作れるPythonライブラリ
 • 具体的には、可視化ライブラリによる表示やUIコンポネントの配置が楽 
 • streamlitがどれくらい簡単かをデモを通じてみていきます!
 
 3 streamlit is 何?

  4. Copyright © 2021 Classi Corp. All Rights Reserved. Demo Code:

    https://github.com/irisu-inwl/stapy73_streamlit • Installation(streamlit): pip install streamlit • Local deployment(demo code): docker-compose up -> localhost:8080 にアクセス • 以前書いた記事を元にstreamlitの感触つかめる程度にデモします • cf: streamlitで遊ぼう! 
 • 内容: 
 • UI Widget
 • Visualization
 • Cache
 • Session state
 
 じゃあ、どういうことできるの?(デモ) 4
  5. Copyright © 2021 Classi Corp. All Rights Reserved. デモ(Widget) •

    button,input,select box,file uploadなど基本的なコンポーネントが簡単 に配置できる • リリースが早いのでChangelogは要チェック! • expanderは元々beta_expanderで使えたが、0.86.0からprefix beta_は消えたので注意 • download_buttonは数日前リリースの0.88.0にて追加 5
  6. Copyright © 2021 Classi Corp. All Rights Reserved. デモ(Visualization) •

    データサイエンス系でよく使う可視化ライブラリを簡単に使える • matploltlib • plotly • bokeh (※現状 bokeh==2.2 しか対応してないので注意 : issue ) • 他ライブラリ(例えばsklearn, networkx)と組み合わせた幅広い可視化 が可能 6
  7. Copyright © 2021 Classi Corp. All Rights Reserved. App model,

    cache and session state streamlitを使っていると意外に実行順序の挙動に振り回されます。 その対策を解説します。 7 • rendering時にpythonコードを上 から順に実行する • widgetからイベントが発火するた びにコードが再実行される • 再計算を防ぐ場合はcacheを用 いる cited from: https://docs.streamlit.io/en/stable/main_concepts.html #app-model
  8. Copyright © 2021 Classi Corp. All Rights Reserved. App model,

    cache and state(デモ) • cache • cacheを使う場合と使わない場合で比較してみる • 重い処理をキャッシュできる。(ex) 機械学習モデルの読み込み, データの前処理 8 • Session State • 「実行順序的に変数に値を入れたり、アプリに状態持てなくない? 🤔」 • Session State機能(>= 0.84.0)ができたのでこれを使う • 昔はなかったので自前実装が必要だった 😭 (cf) streamlitで変数の状態を維持する
  9. Copyright © 2021 Classi Corp. All Rights Reserved. どういう感じに使っているか •

    基本的には内部ツールに使ってます • 運用しているデータのグラフ構造を可視化する • holoviews+bokehでグラフ構造を可視化、グラフ構造を確認しながら運用者を支援するツール • MLシステムの実験を行い、指標を可視化する • 実験したい条件をstreamlit上で入力、条件に合致したデータを取得、実験を実施し、指標を見ながらモデルの 状態をデバッグできる • 使ってみた所感 • Jupyter上のコードをほぼそのまま移植できるので楽 • なので、データサイエンスプロジェクトのプロトタイピングなどにも有効だと思う • (streamlitの仕様とかに苦しまなければ)大体 1日程度で実装できる • 2週間頑張って作ったけど意味なかった 😭 みたいなのも減りそう • コミュニティが活発で、困ったらdocumentとdiscussion見れば済むことが多い • アップデートが早いので、changelogを見て何ができて何ができないか知るのが大切 9
  10. Copyright © 2021 Classi Corp. All Rights Reserved. GCPデプロイ編! •

    streamlitで作ったアプリケーションをデプロイします • 公式だと、streamlit shareを使う方法が解説されている • Data/AI系だとDWHとしてBigqueryを使っていることが多いので、GCPへ のデプロイを解説します 10 ここからほぼpythonの話しなくなるけど大丈夫かな
  11. Copyright © 2021 Classi Corp. All Rights Reserved. Computing Architecture

    in GCP GCPでアプリケーションをデプロイする先は何があるか? 11 GAE,GKEについてデプロイする場合を見ていきます 👀 Cloud Function FaaS, 関数を実行する Cloud Run CaaS, コンテナをデプロイする App Engine (GAE) PaaS, コードに対して実行環境を簡単にデプロイできる • runtime: python,go,nodejsなどの実行環境が予め用意されている • custom runtime: 自分で作ったdockerfileをbuild & deploy Kubernetes Engine(GKE) Kubernetesのマネージドサービス • standard mode: 自分でNodeを運用する • autopilot mode: Nodeがマネージドされている(運用コストが低い) Compute Engine(GCE) IaaS
  12. Copyright © 2021 Classi Corp. All Rights Reserved. 備考: Cloud

    Run • Cloud RunにデプロイするとConnection Errorが発生 • 調べてみると、同じ現象のissue見つかる: Streamlit 404 error in Google Cloud Run “...it seems to follow the AWS Lambda model where you need your app to be stateless and purely event-based. But that's not how Streamlit works, since it uses a persistent websocket connection.” • Websocket通信によりアーキ的に無理だった • ただし、最近のupdateでWebsocket対応したので、 うまくいきそう 12
  13. Copyright © 2021 Classi Corp. All Rights Reserved. GAE -

    App Engineのデプロイ手順 • App Engineへのデプロイ: • コードをデプロイする設定ファイルの app.yamlを書く • gcloud app deploy するだけでデプロイが実行される • app.yamlは以下のような感じ ( 参考 ) runtime: python38 service: myapp instance_class: F2 • App Engine(custom runtime) にstreamlit appをデプロイ • 単純にworking directoryにあるDockerfileをデプロイしてくれる • app.yamlを以下のように作って gcloud app deploy する( コード) runtime: custom service: streamlit-demo-custom env: flex resources: cpu: 1 memory_gb: 2 network: session_affinity: true 13
  14. Copyright © 2021 Classi Corp. All Rights Reserved. GAE -

    IP Addressの限定公開 • 単純にApp Engineデプロイするとアプリが一般公開になってしまうので 限定公開にしたい • 代表的には、Cloud ArmorによるIP制限またはIdentity Aware Proxy (IAP)によるIAM認証 によって解決できる。今回はIAPの方法を説明します。 14 • Identity Aware Proxy (IAP)とは? • サービスに対するリクエストに割り込んで認証を挟む機能 • IAPで保護したいアドレスに対してIAP-Secured Web App Userの 権限を付与すれば閲覧可能となる IAP Web App
  15. Copyright © 2021 Classi Corp. All Rights Reserved. GAE -

    IAPの設定 • 設定方法(手動) • APIサービスから認証画面を作成 • セキュリティ > Identity-Aware Proxyの設定画面を開く • 右図のIAP列のボタンをONにする(右図上部) • 左列チェックをONにするとIAMの情報パネルが開くので制限 したいユーザーにIAP-Secured Web App Userを付与(右図下 部) • 詳細は下記ハンズオンが詳しい : • ユーザー認証: Identity-Aware Proxy • IAPを使うメリット: • VPNの負荷解消、IAMベースでの細かいアクセス制限 • IAP tunnelingでprivateなインスタンスにも接続してテストが可 能 (参考 ) 15
  16. Copyright © 2021 Classi Corp. All Rights Reserved. • そもKubernetesってなんぞや?

    • コンテナオーケストレーションシステム • コンテナを使ってサービスの提供、運用保守を良い感じに管理してくれるシステム • 超々ざっくりいってしまうと、色々できる docker-composeというイメージ • Kubernetesのコンポーネント • Cluster: 複数サーバー群によるコンテナ実行環境全体のこと、全体を管理するコントロー ルプレーン、コンテナ実行するノードに分かれる • Node: コンテナ実行をするコンピューティング環境(一つの GCEから構成) • Pod: アプリケーションコンテナグループ • Service: Podのネットワークサービスとしての設定 • どうやってデプロイするのか? • manifest fileを書いて、kubectl -f ${MANIFEST_DIR} すればOK • kustomizeを使う場合は kubectl -k ${MANIFEST_DIR} • manifestにIngressの情報、Cloud ArmorやIdentity Aware Proxyの設定など書ける GKE - Kubernetesについて 16
  17. Copyright © 2021 Classi Corp. All Rights Reserved. GKE -

    streamlit appをデプロイする プロトタイピング用のアプリケーション基盤 17 VPC Cloud Armor Ingress Private GKE GCR docke image terraform apply Cloud DNS kubectl apply local NAT IAP or プロトタイピングデプロイ基盤のアーキテクチャ • 右図のようなアーキテクチャ • GKEでStreamlitをホスティングして社内用アプリを作った話 を 参考にしました • インフラはterraformでIaCにしておいてterraform apply でGCP上にデプロイ可能 • 色々なツールをGKE上にデプロイするとmanifest が乱立するのでkustomizeを使って、ある程度テン プレート化する • GAEと比較すると用意するmanifestが多く学習コ スト、管理コストが高いが、複数サービス連携す る場合適してる
  18. Copyright © 2021 Classi Corp. All Rights Reserved. GKE -

    sample code デモアプリをデプロイするサンプルコードを書いたので参考まで 󰢛 • terraform • https://github.com/irisu-inwl/stapy73_streamlit/tree/main/terraform • kubernetes manifest file • https://github.com/irisu-inwl/stapy73_streamlit/tree/main/kubernetes/template • kustomization • https://github.com/irisu-inwl/stapy73_streamlit/blob/main/kustomization.yaml.template • deploy script • https://github.com/irisu-inwl/stapy73_streamlit/blob/main/deploy_kubernetes.sh 18
  19. Copyright © 2021 Classi Corp. All Rights Reserved. セキュリティ •

    なぜセキュリティ対策すべきか? • 内部ツールやプロトタイピングでも、データにアクセスしている場合、重要情報の漏洩・イ ンシデントにつながるリスクがある • 乱立しがちなので、アタックしやすい対象 • インスタンスを乗っ取られて、リソースを悪用される • どうやって対策するの?(代表的な施策を抜粋) • 基本的にはプラクティスに従う: • サービス アカウントの使用と管理のベスト プラクティス • Google Cloud セキュリティ ベスト プラクティス センター • 脅威を検知する • GCPだとSecurity Command Centerがすごく便利 • Google Cloudさんの弊社事例記事にお気持ちすべて詰め込みました : Classi株式会社:脆弱性を可視化し脅威検出も可能。対応策の提案機能を有効活用し、統合管理でセキュリティをさらに強化 • IAP, Cloud Armorで外部アクセス制限に定期的にリクエストを投げてテストする • 作った検知機能が正しく動作しているかのテスティング ※セキュリティといっても広いので、今回はアプリケーションに限定 19
  20. Copyright © 2021 Classi Corp. All Rights Reserved. セキュリティ 具体的には?

    • Network • デフォルトネットワークは強すぎるので使わない • 組織ポリシーから無効化 • 外部からのアクセス制限にCloud ArmorかIdentity Aware Proxy(IAP)を使う • Container Security • GKEは限定公開クラスタにして、IP制限かける(Master Authorized Networkの設定) • Container Registry (Artifact Registry) のイメージ脆弱性検知による検知、対策 • Workload IdentityやPod Security Policy • OSログインの有効化 • GKEもnode poolの1.20.5以降対応できるようになった ※ 大体の対策はSecurtiy Command Centerが検知してくれます 20
  21. Copyright © 2021 Classi Corp. All Rights Reserved. まとめ Streamlit編

    • streamlitはwebアプリを簡単に作れるPythonライブラリ 
 • 実行順序を考えてcache, sessionを利用する
 • version upが早いので、前のコードが動かなくったり、より良い実装があ るため、changelogは要チェック
 GCPデプロイ編
 • GAEとGKEのデプロイについて解説、GAEは手軽、GKEは複雑な構成 が可能
 • セキュリティはSecurity Command Centerである程度検知可能
 21