■イベント Sansan Builders Box 2019 https://jp.corp-sansan.com/sbb2019/
■登壇概要 タイトル: GCP サーバーレスサービス×少数チームで新たなデータ化サービスを立ち上げる
登壇者: DSOC Development Group 木田悠一郎
▼Sansan Builders Box https://buildersbox.corp-sansan.com/
GCP サーバーレスサービス×少数チームで新たなデータ化サービスを⽴ち上げる
View Slide
Sansan Builders BoxAgenda- 名刺の⾼精度なデータ化を⽀えるノウハウ- GCP サーバーレス サービス紹介- アーキテクチャ- メリット・注意点・課題
⽊⽥ 悠⼀郎(Yuichiro Kida)2016年 3⽉ 早稲⽥⼤学 社会科学部 卒業2016年 4⽉ 株式会社富⼠通ソーシアルサイエンスラボラトリ ⼊社2017年 2⽉ 株式会社ジンジャーアップ ⼊社システム開発会社に出向、Ruby on Rails で開発2018年 2⽉ Sansan 株式会社 ⼊社Eight のフロントエンド・サーバーサイド開発2018年 6⽉ DSOC に異動GEES(名刺のデータ化システム)の開発・運⽤新規プロダクト開発DSOC Development Group エンジニア
法⼈向けクラウド名刺管理サービス 個⼈向け名刺アプリ
Sansan Builders Box機械の⼒と⼈の⼒を組み合わせる⾼精度なデータ化を⽀えるノウハウ
Sansan Builders Boxこれにより、オペレーターは効率的に最終チェックを⾏うことが可能になります。ミステイクディテクター誤りの傾向を学習してミスの可能性を予測
Sansan Builders Box⾔語処理判定名刺画像から⾔語を判定○4⾔語(⽇英中韓)に対応○データ化フローの効率化○オペレータへの振り分けの⾃動化○精度 98 %参考資料:”Deep Residual Learning for Image Recognition” Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sunhttps://arxiv.org/abs/1512.03385⾔語判定モデル⽇本語名刺英語名刺中国語名刺その他⾔語韓国語名刺名 刺
Sansan Builders Box•項⽬判別の結果を学習•単体モデルで項⽬矩形、項⽬名の推定•精度 98 %項⽬セグメンテーション⽂字を読み取らずに、名刺のデザインから項⽬を⾒分ける
Sansan Builders Box- ⼀つの項⽬に対する、複数のオペレータによる多重⼊⼒- ⼊⼒内容に対する⽬視チェック- ⼊⼒ルールやトレーニング問題の作成オペレーターによる⼊⼒
Sansan Builders Box本⽇は、⾼精度なデータ化ノウハウを活⽤した「⾮定型⽂書のデータ化」に関する取り組みをご紹介新たなデータ化サービスの検証※ 正式な新サービスの発表ではございません
Sansan Builders Box- Google App Engine- Cloud Firestore- Cloud Tasks- Stackdriver- Cloud Storage- Cloud FunctionsGCP サーバーレス サービスについて
Sansan Builders Box- Google App Engine- Cloud Firestore- Cloud Tasks- Stackdriver- Cloud Storage ≒ AWS S3- Cloud Functions ≒ AWS LabmdaGCP サーバーレス サービスについて
Sansan Builders BoxPaaS(Platform as a Service)- スケールアウト・デプロイが⾼速- インスタンスがゼロまでスケールイン- サポートランタイム- Java, Python, Go, PHP, Node.js, Ruby(beta)Google App EngineApp Engine
Sansan Builders Boxサーバーレスなドキュメント指向 NoSQL データベース- アプリケーションの負荷に応じて⾃動的に⽔平スケーリング- 強整合性- ⾼い可⽤性- マルチリージョンで 99.999% 以上- リージョンで 99.99% 以上Cloud FirestoreCloud Firestore
Sansan Builders BoxྫʣͦΕͧΕͷνϟοτϧʔϜʹෳͷϝοηʔδ͕͋Δ- rooms- room-A- messages- message-1- message-2- …- room-B- …Cloud Firestore の階層データname: “開発ルーム”from: “太郎”, msg: “こんにちは!”from: “次郎”, msg: “Hello!”Cloud Firestore
Sansan Builders BoxྫʣͦΕͧΕͷνϟοτϧʔϜʹෳͷϝοηʔδ͕͋Δ- rooms- room-A- messages- message-1- message-2- …- room-B- …Cloud Firestore の階層データname: “開発ルーム”from: “太郎”, msg: “こんにちは!”from: “次郎”, msg: “Hello!”← (ルート)コレクションCloud Firestore
Sansan Builders BoxྫʣͦΕͧΕͷνϟοτϧʔϜʹෳͷϝοηʔδ͕͋Δ- rooms- room-A- messages- message-1- message-2- …- room-B- …Cloud Firestore の階層データname: “開発ルーム”from: “太郎”, msg: “こんにちは!”from: “次郎”, msg: “Hello!”← (ルート)コレクション← ドキュメントCloud Firestore
Sansan Builders BoxྫʣͦΕͧΕͷνϟοτϧʔϜʹෳͷϝοηʔδ͕͋Δ- rooms- room-A- messages- message-1- message-2- …- room-B- …Cloud Firestore の階層データname: “開発ルーム”from: “太郎”, msg: “こんにちは!”from: “次郎”, msg: “Hello!”← (ルート)コレクション← ドキュメント← rooms のサブコレクションCloud Firestore
Sansan Builders BoxྫʣͦΕͧΕͷνϟοτϧʔϜʹෳͷϝοηʔδ͕͋Δ- rooms- room-A- messages- message-1- message-2- …- room-B- …Cloud Firestore の階層データname: “開発ルーム”from: “太郎”, msg: “こんにちは!”from: “次郎”, msg: “Hello!”← (ルート)コレクション← ドキュメント← rooms のサブコレクション← ドキュメントCloud Firestore
Sansan Builders Box- Map- JavaScript のオブジェクト、Ruby のハッシュ、Python の辞書型のような値を⼊れられる- Array- Boolean- Date and time- String- …参考: https://firebase.google.com/docs/firestore/manage-data/data-typesCloud Firestore のデータ型Cloud Firestore
Sansan Builders Boxフルマネージドなタスクキューサービス- 処理を⾮同期で実⾏できる- HTTP Target タスク(beta)- App Engine タスク- 同時タスクの最⼤レートや最⼤数を設定できるCloud TasksCloud Tasks
Sansan Builders Boxアプリケーション、インフラストラクチャのモニタリングと管理- ロギング => Stackdriver Logging- エラー通知 => Stackdriver Error Reporting- モニタリング => Stackdriver MonitoringStackdriverStackdriver
Sansan Builders Boxサービスの全体像⾮定型⽂書画像データ化結果⼊⼒ / データ化システム社内オペレーター⾃動化エンジンユーザー側システムデータ化⾮定型⽂書データ化システムアップロード
Sansan Builders Boxサービスの全体像データ化結果⼊⼒ / データ化システム社内オペレーター⾃動化エンジンユーザー側システムデータ化アップロード⾮定型⽂書画像⾮定型⽂書データ化システム
Sansan Builders Box使⽤⾔語Cloud FunctionsNode.jsバックエンドNode.js, TypeScript, Express⾃動化エンジンC#フロントエンドReact, Redux, TypeScript
Sansan Builders Box1. 運⽤負荷を下げたい- 本質的な機能の開発に集中したい2. マルチクラウドを推進- GCP が導⼊しやすい状況にあった3. チャレンジ- 本気で使うことで、メリット・デメリットを把握することができるGCP サーバーレス サービス導⼊の背景
Sansan Builders BoxアーキテクチャKPI 基盤ロギング / エラー通知Stackdriverユーザー側システムBigQueryCloudPub/Sub自動化エンジンCloudDataflowAppEngineCloudFunctionsCloudStorageCloudFirestoreComputeEngineCloud Tasks入力 / データ化システム
Sansan Builders BoxアーキテクチャKPI 基盤ロギング / エラー通知Stackdriverユーザー側システムBigQueryCloudPub/Sub自動化エンジンCloudDataflowAppEngineCloudFunctionsCloudStorageCloudFirestoreComputeEngineCloud Tasks入力 / データ化システムファイル連携
Sansan Builders Boxオペレーターからの⼊⼒を受け付けるApp Engine(Node.js)Cloud TasksCloud Firestore社内オペレーター App Engine(SPA アプリケーション)非同期処理
Sansan Builders Box- Cloud Functions の Cloud Storage トリガー- Cloud Tasks の App Engine タスクファイルアップロードで特定の処理を⾏うCloud Storage Cloud Functions App EngineCloud Tasks
Sansan Builders Box⾮定型⽂書画像とオペレーターの⼊⼒データのセットを学習⾃動化エンジン - Compute Engine少しずつ⾃動化していく※ Web API として連携
Sansan Builders Box- Google App Engine から Cloud Pub/Sub 経由でログを送信- Tableau で可視化KPI 基盤App Engine BigQueryCloud Pub/Sub Cloud Dataflow
GCP サーバーレス サービス導⼊のメリット
Sansan Builders Box① アプリケーションのコードに集中できる② サーバー管理不要③ コスト最適化メリット
Sansan Builders Box- ⾮同期実⾏- 定期実⾏- デプロイ- IPアドレス制限- トラフィック分割メリット①:アプリケーションのコードに集中できるApp Engine
Sansan Builders Boxメリット①:アプリケーションのコードに集中できるCloud TasksApp Engine Crongcloud コマンドApp Engine ファイア ウォールTraffic Splitting- ⾮同期実⾏- 定期実⾏- デプロイ- IPアドレス制限- トラフィック分割App Engine
Sansan Builders Boxトラフィック分割 - Traffic SplittingApp Engine- 複数バージョンのインスタンスを同時に動かせる- IP アドレスや Cookie でトラフィックを分割できる- 管理画⾯からインスタンスのバージョンを変更できる
Sansan Builders Box- 複数バージョンのインスタンスを同時に動かせる- IP アドレスや Cookie でトラフィックを分割できる- 管理画⾯からインスタンスのバージョンを変更できるトラフィック分割 - Traffic SplittingApp Engine→ 動作確認やテスト
Sansan Builders Box- 複数バージョンのインスタンスを同時に動かせる- IP アドレスや Cookie でトラフィックを分割できる- 管理画⾯からインスタンスのバージョンを変更できるトラフィック分割 - Traffic SplittingApp Engine→ 動作確認やテスト→ A/Bテスト
Sansan Builders Box- 複数バージョンのインスタンスを同時に動かせる- IP アドレスや Cookie でトラフィックを分割できる- 管理画⾯からインスタンスのバージョンを変更できるトラフィック分割 - Traffic SplittingApp Engine→ 動作確認やテスト→ A/Bテスト→ ロールバック
Sansan Builders Box- 負荷に応じてオートスケール- サーバーのプロビジョニングが不要メリット②:サーバー管理不要App Engine Cloud Firestore
Sansan Builders Box- 基本使った分だけ課⾦- インスタンスがゼロまでスケールインなど- Google App Engine / Standard Environment- Cloud Runコスト最適化
Sansan Builders Boxメリット(ふりかえり)① アプリケーションのコードに集中できる② サーバー管理不要③ コスト最適化
Sansan Builders Boxメリット(ふりかえり)① アプリケーションのコードに集中できる② サーバー管理不要③ コスト最適化限られたリソースでもスピード感を持って開発できる
GCP サーバーレス サービス導⼊の注意点
Sansan Builders Box① Google App Engine 環境② App Engine ファイアウォール③ Cloud Firestore のデータベース設計注意点
Sansan Builders Box- スタンダード環境 or フレキシブル環境> 可能な限りスタンダード環境を使う- デプロイやスケーリングが⾼速- インスタンスがゼロまでスケールイン- 公式ドキュメント参照- https://cloud.google.com/appengine/docs/flexible/java/flexible-for-standard-users?hl=ja注意点①:Google App Engine 環境App Engine
Sansan Builders BoxGAEΠϯελϯεΛ VPC ωοτϫʔΫʹඥ͚͍ͨ࣌- AWS 上の社内サービスと VPN で接続したかったので、⼀部 GAE/FE を使⽤- 現在は Serverless VPC Access を使えば、スタンダード環境からVPC リソースにアクセス可能> 東京リージョンに来たら乗り換えることを検討中GAE/FE を使う場⾯ - Google App Engine / Flexible Environment -App Engine
Sansan Builders BoxಛఆͷϥΠϒϥϦΛ͍͍ͨ࣌- 別サービスに切り出して Docker イメージを使⽤- 現在は Cloud Run を使⽤することで、GAE/SE のようなスケーラビリティを保ちつつ、Docker イメージを使った構成にできるGAE/FE を使う場⾯ - Google App Engine / Flexible Environment -App Engine
Sansan Builders BoxGCP サービス間の通信もブロックされることがある- Cloud Pub/Sub はグローバルなサービスであるため、ホワイトリスト追加はできない- Cloud Tasks は内部的に URL フェッチ サービスを使っているため、URL フェッチ サービスの IP アドレスを許可する注意点②:App Engine ファイアウォールCloud StorageCloudFunctionsApp EngineCloud TasksApp EngineCloudPub/SubCloud StorageApp Engine
Sansan Builders BoxSQL ͷΑ͏ͳ COUNT ؔͳ͍- ドキュメントをガバっと取ってきてカウントすることはできる- 分散カウンタを使う- 制約:1 ドキュメントあたり 1 秒間に約 1 回しか更新できない- カウンタ⽤のドキュメントを複数⽤意して、ランダムにインクリメントする- 全ドキュメントを取得して合計を計算する- FieldValue.increment() を使う(v1.1.0 でリリース)- 要件によっては、Redis などでカウントするのもあり注意点③:Cloud Firestore のデータベース設計Cloud Firestore
Sansan Builders Box1 : N ͷσʔλɿॻ͖ࠐΈಡΈࠐΈͷසͰஅ͢Δ- ⼀緒に扱うことが多い場合 => Array 型としてフィールドに持たせる- 1 ドキュメントあたり 1 秒間に約 1 回しか更新できない- 別々に扱うことが多い場合 => サブコレクションに持たせる- コレクションとサブコレクションにまたがったクエリはできない※ バックエンドから使うかフロントエンドから使うかで、判断軸は異なるのではないか、と考えていますFirestore で関連をどのように持つかCloud Firestore
今後の課題
Sansan Builders Box①:開発環境②:動作確認③:分析系クエリ④:エラー通知> これから整えていく今後の課題
Sansan Builders Box- Cloud Firestore は 1 プロジェクトに 1 つしか DB を作れない- 開発・⾃動テスト- Cloud Tasks は Push なので、ローカルに向けられない- 開発時は Cloud Tasks をモックするか今後の課題 ①:開発環境
Sansan Builders Box- Heroku Review Apps のようなことをしたい- PR ごとに環境を⽴てる- Google App Engine は複数バージョンのインスタンスを同時に動かすことができる今後の課題 ②:動作確認
Sansan Builders Box- SQL のように柔軟なクエリはない- BigQuery にデータをインポートする今後の課題 ③:分析系クエリ
Sansan Builders Box- Stackdriver Error Reporting からの メール通知をGmail のフィルタ機能で Slack に通知している- タイムラグがある- テキストをカスタマイズできない- Datadog への集約を検討今後の課題 ④:エラー通知
Sansan Builders BoxGCP サーバーレス サービス- 限られたリソースでもスピード感を持って開発できる- フルマネージド、オートスケールの良さを享受できる⼀⽅で、制約やクセがある- メンバーが増えてくると、開発環境などの整備に⼯夫が必要まとめ
We are hiring!