Slide 1

Slide 1 text

GCP サーバーレスサービス×少数チームで 新たなデータ化サービスを⽴ち上げる

Slide 2

Slide 2 text

Sansan Builders Box Agenda - 名刺の⾼精度なデータ化を⽀えるノウハウ - GCP サーバーレス サービス紹介 - アーキテクチャ - メリット・注意点・課題

Slide 3

Slide 3 text

⽊⽥ 悠⼀郎(Yuichiro Kida) 2016年 3⽉ 早稲⽥⼤学 社会科学部 卒業 2016年 4⽉ 株式会社富⼠通ソーシアルサイエンスラボラトリ ⼊社 2017年 2⽉ 株式会社ジンジャーアップ ⼊社 システム開発会社に出向、Ruby on Rails で開発 2018年 2⽉ Sansan 株式会社 ⼊社 Eight のフロントエンド・サーバーサイド開発 2018年 6⽉ DSOC に異動 GEES(名刺のデータ化システム)の開発・運⽤ 新規プロダクト開発 DSOC Development Group エンジニア

Slide 4

Slide 4 text

Sansan Builders Box Agenda - 名刺の⾼精度なデータ化を⽀えるノウハウ - GCP サーバーレス サービス紹介 - アーキテクチャ - メリット・注意点・課題

Slide 5

Slide 5 text

法⼈向けクラウド名刺管理サービス 個⼈向け名刺アプリ

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

Sansan Builders Box 機械の⼒と⼈の⼒を組み合わせる ⾼精度なデータ化を⽀えるノウハウ

Slide 8

Slide 8 text

Sansan Builders Box これにより、オペレーターは効率的に最終チェックを⾏うことが可能になります。 ミステイクディテクター 誤りの傾向を学習してミスの可能性を予測

Slide 9

Slide 9 text

Sansan Builders Box ⾔語処理判定 名刺画像から⾔語を判定 ○4⾔語(⽇英中韓)に対応 ○データ化フローの効率化 ○オペレータへの振り分けの⾃動化 ○精度 98 % 参考資料:”Deep Residual Learning for Image Recognition” Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun https://arxiv.org/abs/1512.03385 ⾔語判定モデル ⽇本語名刺 英語名刺 中国語名刺 その他⾔語 韓国語名刺 名 刺

Slide 10

Slide 10 text

Sansan Builders Box •項⽬判別の結果を学習 •単体モデルで項⽬矩形、項⽬名の推定 •精度 98 % 項⽬セグメンテーション ⽂字を読み取らずに、 名刺のデザインから項⽬を⾒分ける

Slide 11

Slide 11 text

Sansan Builders Box - ⼀つの項⽬に対する、複数のオペレータによる多重⼊⼒ - ⼊⼒内容に対する⽬視チェック - ⼊⼒ルールやトレーニング問題の作成 オペレーターによる⼊⼒

Slide 12

Slide 12 text

Sansan Builders Box 本⽇は、⾼精度なデータ化ノウハウを活⽤した 「⾮定型⽂書のデータ化」に関する取り組みをご紹介 新たなデータ化サービスの検証 ※ 正式な新サービスの発表ではございません

Slide 13

Slide 13 text

Sansan Builders Box Agenda - 名刺の⾼精度なデータ化を⽀えるノウハウ - GCP サーバーレス サービス紹介 - アーキテクチャ - メリット・注意点・課題

Slide 14

Slide 14 text

Sansan Builders Box - Google App Engine - Cloud Firestore - Cloud Tasks - Stackdriver - Cloud Storage - Cloud Functions GCP サーバーレス サービスについて

Slide 15

Slide 15 text

Sansan Builders Box - Google App Engine - Cloud Firestore - Cloud Tasks - Stackdriver - Cloud Storage ≒ AWS S3 - Cloud Functions ≒ AWS Labmda GCP サーバーレス サービスについて

Slide 16

Slide 16 text

Sansan Builders Box PaaS(Platform as a Service) - スケールアウト・デプロイが⾼速 - インスタンスがゼロまでスケールイン - サポートランタイム - Java, Python, Go, PHP, Node.js, Ruby(beta) Google App Engine App Engine

Slide 17

Slide 17 text

Sansan Builders Box サーバーレスなドキュメント指向 NoSQL データベース - アプリケーションの負荷に応じて⾃動的に⽔平スケーリング - 強整合性 - ⾼い可⽤性 - マルチリージョンで 99.999% 以上 - リージョンで 99.99% 以上 Cloud Firestore Cloud Firestore

Slide 18

Slide 18 text

Sansan Builders Box ྫʣͦΕͧΕͷνϟοτϧʔϜʹෳ਺ͷϝοηʔδ͕͋Δ - rooms - room-A - messages - message-1 - message-2 - … - room-B - … Cloud Firestore の階層データ name: “開発ルーム” from: “太郎”, msg: “こんにちは!” from: “次郎”, msg: “Hello!” Cloud Firestore

Slide 19

Slide 19 text

Sansan Builders Box ྫʣͦΕͧΕͷνϟοτϧʔϜʹෳ਺ͷϝοηʔδ͕͋Δ - rooms - room-A - messages - message-1 - message-2 - … - room-B - … Cloud Firestore の階層データ name: “開発ルーム” from: “太郎”, msg: “こんにちは!” from: “次郎”, msg: “Hello!” ← (ルート)コレクション Cloud Firestore

Slide 20

Slide 20 text

Sansan Builders Box ྫʣͦΕͧΕͷνϟοτϧʔϜʹෳ਺ͷϝοηʔδ͕͋Δ - rooms - room-A - messages - message-1 - message-2 - … - room-B - … Cloud Firestore の階層データ name: “開発ルーム” from: “太郎”, msg: “こんにちは!” from: “次郎”, msg: “Hello!” ← (ルート)コレクション ← ドキュメント Cloud Firestore

Slide 21

Slide 21 text

Sansan Builders Box ྫʣͦΕͧΕͷνϟοτϧʔϜʹෳ਺ͷϝοηʔδ͕͋Δ - rooms - room-A - messages - message-1 - message-2 - … - room-B - … Cloud Firestore の階層データ name: “開発ルーム” from: “太郎”, msg: “こんにちは!” from: “次郎”, msg: “Hello!” ← (ルート)コレクション ← ドキュメント ← rooms のサブコレクション Cloud Firestore

Slide 22

Slide 22 text

Sansan Builders Box ྫʣͦΕͧΕͷνϟοτϧʔϜʹෳ਺ͷϝοηʔδ͕͋Δ - rooms - room-A - messages - message-1 - message-2 - … - room-B - … Cloud Firestore の階層データ name: “開発ルーム” from: “太郎”, msg: “こんにちは!” from: “次郎”, msg: “Hello!” ← (ルート)コレクション ← ドキュメント ← rooms のサブコレクション ← ドキュメント Cloud Firestore

Slide 23

Slide 23 text

Sansan Builders Box - Map - JavaScript のオブジェクト、Ruby のハッシュ、 Python の辞書型のような値を⼊れられる - Array - Boolean - Date and time - String - … 参考: https://firebase.google.com/docs/firestore/manage-data/data-types Cloud Firestore のデータ型 Cloud Firestore

Slide 24

Slide 24 text

Sansan Builders Box フルマネージドなタスクキューサービス - 処理を⾮同期で実⾏できる - HTTP Target タスク(beta) - App Engine タスク - 同時タスクの最⼤レートや最⼤数を設定できる Cloud Tasks Cloud Tasks

Slide 25

Slide 25 text

Sansan Builders Box アプリケーション、インフラストラクチャのモニタリングと管理 - ロギング => Stackdriver Logging - エラー通知 => Stackdriver Error Reporting - モニタリング => Stackdriver Monitoring Stackdriver Stackdriver

Slide 26

Slide 26 text

Sansan Builders Box Agenda - 名刺の⾼精度なデータ化を⽀えるノウハウ - GCP サーバーレス サービス紹介 - アーキテクチャ - メリット・注意点・課題

Slide 27

Slide 27 text

Sansan Builders Box サービスの全体像 ⾮定型⽂書画像 データ化結果 ⼊⼒ / データ化 システム 社内オペレーター ⾃動化エンジン ユーザー側 システム データ化 ⾮定型⽂書データ化システム アップロード

Slide 28

Slide 28 text

Sansan Builders Box サービスの全体像 データ化結果 ⼊⼒ / データ化 システム 社内オペレーター ⾃動化エンジン ユーザー側 システム データ化 アップロード ⾮定型⽂書画像 ⾮定型⽂書データ化システム

Slide 29

Slide 29 text

Sansan Builders Box 使⽤⾔語 Cloud Functions Node.js バックエンド Node.js, TypeScript, Express ⾃動化エンジン C# フロントエンド React, Redux, TypeScript

Slide 30

Slide 30 text

Sansan Builders Box 1. 運⽤負荷を下げたい - 本質的な機能の開発に集中したい 2. マルチクラウドを推進 - GCP が導⼊しやすい状況にあった 3. チャレンジ - 本気で使うことで、メリット・デメリットを把握することができる GCP サーバーレス サービス導⼊の背景

Slide 31

Slide 31 text

Sansan Builders Box アーキテクチャ KPI 基盤 ロギング / エラー通知 Stackdriver ユーザー側 システム BigQuery Cloud Pub/Sub 自動化エンジン Cloud Dataflow App Engine Cloud Functions Cloud Storage Cloud Firestore Compute Engine Cloud Tasks 入力 / データ化 システム

Slide 32

Slide 32 text

Sansan Builders Box アーキテクチャ KPI 基盤 ロギング / エラー通知 Stackdriver ユーザー側 システム BigQuery Cloud Pub/Sub 自動化エンジン Cloud Dataflow App Engine Cloud Functions Cloud Storage Cloud Firestore Compute Engine Cloud Tasks 入力 / データ化 システム

Slide 33

Slide 33 text

Sansan Builders Box アーキテクチャ KPI 基盤 ロギング / エラー通知 Stackdriver ユーザー側 システム BigQuery Cloud Pub/Sub 自動化エンジン Cloud Dataflow App Engine Cloud Functions Cloud Storage Cloud Firestore Compute Engine Cloud Tasks 入力 / データ化 システム

Slide 34

Slide 34 text

Sansan Builders Box アーキテクチャ KPI 基盤 ロギング / エラー通知 Stackdriver ユーザー側 システム BigQuery Cloud Pub/Sub 自動化エンジン Cloud Dataflow App Engine Cloud Functions Cloud Storage Cloud Firestore Compute Engine Cloud Tasks 入力 / データ化 システム ファイル 連携

Slide 35

Slide 35 text

Sansan Builders Box アーキテクチャ KPI 基盤 ロギング / エラー通知 Stackdriver ユーザー側 システム BigQuery Cloud Pub/Sub 自動化エンジン Cloud Dataflow App Engine Cloud Functions Cloud Storage Cloud Firestore Compute Engine Cloud Tasks 入力 / データ化 システム

Slide 36

Slide 36 text

Sansan Builders Box アーキテクチャ KPI 基盤 ロギング / エラー通知 Stackdriver ユーザー側 システム BigQuery Cloud Pub/Sub 自動化エンジン Cloud Dataflow App Engine Cloud Functions Cloud Storage Cloud Firestore Compute Engine Cloud Tasks 入力 / データ化 システム

Slide 37

Slide 37 text

Sansan Builders Box アーキテクチャ KPI 基盤 ロギング / エラー通知 Stackdriver ユーザー側 システム BigQuery Cloud Pub/Sub 自動化エンジン Cloud Dataflow App Engine Cloud Functions Cloud Storage Cloud Firestore Compute Engine Cloud Tasks 入力 / データ化 システム

Slide 38

Slide 38 text

Sansan Builders Box オペレーターからの⼊⼒を受け付ける App Engine (Node.js) Cloud Tasks Cloud Firestore 社内オペレーター App Engine (SPA アプリケーション) 非同期処理

Slide 39

Slide 39 text

Sansan Builders Box - Cloud Functions の Cloud Storage トリガー - Cloud Tasks の App Engine タスク ファイルアップロードで特定の処理を⾏う Cloud Storage Cloud Functions App Engine Cloud Tasks

Slide 40

Slide 40 text

Sansan Builders Box ⾮定型⽂書画像とオペレーターの⼊⼒データのセットを学習 ⾃動化エンジン - Compute Engine 少しずつ⾃動化していく ※ Web API として連携

Slide 41

Slide 41 text

Sansan Builders Box - Google App Engine から Cloud Pub/Sub 経由でログを送信 - Tableau で可視化 KPI 基盤 App Engine BigQuery Cloud Pub/Sub Cloud Dataflow

Slide 42

Slide 42 text

Sansan Builders Box Agenda - 名刺の⾼精度なデータ化を⽀えるノウハウ - GCP サーバーレス サービス紹介 - アーキテクチャ - メリット・注意点・課題

Slide 43

Slide 43 text

GCP サーバーレス サービス導⼊のメリット

Slide 44

Slide 44 text

Sansan Builders Box ① アプリケーションのコードに集中できる ② サーバー管理不要 ③ コスト最適化 メリット

Slide 45

Slide 45 text

Sansan Builders Box - ⾮同期実⾏ - 定期実⾏ - デプロイ - IPアドレス制限 - トラフィック分割 メリット①:アプリケーションのコードに集中できる App Engine

Slide 46

Slide 46 text

Sansan Builders Box メリット①:アプリケーションのコードに集中できる Cloud Tasks App Engine Cron gcloud コマンド App Engine ファイア ウォール Traffic Splitting - ⾮同期実⾏ - 定期実⾏ - デプロイ - IPアドレス制限 - トラフィック分割 App Engine

Slide 47

Slide 47 text

Sansan Builders Box メリット①:アプリケーションのコードに集中できる Cloud Tasks App Engine Cron gcloud コマンド App Engine ファイア ウォール Traffic Splitting - ⾮同期実⾏ - 定期実⾏ - デプロイ - IPアドレス制限 - トラフィック分割 App Engine

Slide 48

Slide 48 text

Sansan Builders Box トラフィック分割 - Traffic Splitting App Engine - 複数バージョンのインスタンスを同時に動かせる - IP アドレスや Cookie でトラフィックを分割できる - 管理画⾯からインスタンスのバージョンを変更できる

Slide 49

Slide 49 text

Sansan Builders Box - 複数バージョンのインスタンスを同時に動かせる - IP アドレスや Cookie でトラフィックを分割できる - 管理画⾯からインスタンスのバージョンを変更できる トラフィック分割 - Traffic Splitting App Engine → 動作確認やテスト

Slide 50

Slide 50 text

Sansan Builders Box - 複数バージョンのインスタンスを同時に動かせる - IP アドレスや Cookie でトラフィックを分割できる - 管理画⾯からインスタンスのバージョンを変更できる トラフィック分割 - Traffic Splitting App Engine → 動作確認やテスト → A/Bテスト

Slide 51

Slide 51 text

Sansan Builders Box - 複数バージョンのインスタンスを同時に動かせる - IP アドレスや Cookie でトラフィックを分割できる - 管理画⾯からインスタンスのバージョンを変更できる トラフィック分割 - Traffic Splitting App Engine → 動作確認やテスト → A/Bテスト → ロールバック

Slide 52

Slide 52 text

Sansan Builders Box - 負荷に応じてオートスケール - サーバーのプロビジョニングが不要 メリット②:サーバー管理不要 App Engine Cloud Firestore

Slide 53

Slide 53 text

Sansan Builders Box - 基本使った分だけ課⾦ - インスタンスがゼロまでスケールインなど - Google App Engine / Standard Environment - Cloud Run コスト最適化

Slide 54

Slide 54 text

Sansan Builders Box メリット(ふりかえり) ① アプリケーションのコードに集中できる ② サーバー管理不要 ③ コスト最適化

Slide 55

Slide 55 text

Sansan Builders Box メリット(ふりかえり) ① アプリケーションのコードに集中できる ② サーバー管理不要 ③ コスト最適化 限られたリソースでもスピード感を持って開発できる

Slide 56

Slide 56 text

GCP サーバーレス サービス導⼊の注意点

Slide 57

Slide 57 text

Sansan Builders Box ① Google App Engine 環境 ② App Engine ファイアウォール ③ Cloud Firestore のデータベース設計 注意点

Slide 58

Slide 58 text

Sansan Builders Box - スタンダード環境 or フレキシブル環境 > 可能な限りスタンダード環境を使う - デプロイやスケーリングが⾼速 - インスタンスがゼロまでスケールイン - 公式ドキュメント参照 - https://cloud.google.com/appengine/docs/flexible/java/flexible-for-standard-users?hl=ja 注意点①:Google App Engine 環境 App Engine

Slide 59

Slide 59 text

Sansan Builders Box GAEΠϯελϯεΛ VPC ωοτϫʔΫʹඥ෇͚͍ͨ࣌ - AWS 上の社内サービスと VPN で接続したかったので、 ⼀部 GAE/FE を使⽤ - 現在は Serverless VPC Access を使えば、スタンダード環境から VPC リソースにアクセス可能 > 東京リージョンに来たら乗り換えることを検討中 GAE/FE を使う場⾯ - Google App Engine / Flexible Environment - App Engine

Slide 60

Slide 60 text

Sansan Builders Box ಛఆͷϥΠϒϥϦΛ࢖͍͍ͨ࣌ - 別サービスに切り出して Docker イメージを使⽤ - 現在は Cloud Run を使⽤することで、GAE/SE のような スケーラビリティを保ちつつ、Docker イメージを使った構成にできる GAE/FE を使う場⾯ - Google App Engine / Flexible Environment - App Engine

Slide 61

Slide 61 text

Sansan Builders Box GCP サービス間の通信もブロックされることがある - Cloud Pub/Sub はグローバルなサービスであるため、 ホワイトリスト追加はできない - Cloud Tasks は内部的に URL フェッチ サービスを使っているため、 URL フェッチ サービスの IP アドレスを許可する 注意点②:App Engine ファイアウォール Cloud Storage Cloud Functions App Engine Cloud Tasks App Engine Cloud Pub/Sub Cloud Storage App Engine

Slide 62

Slide 62 text

Sansan Builders Box SQL ͷΑ͏ͳ COUNT ؔ਺͸ͳ͍ - ドキュメントをガバっと取ってきてカウントすることはできる - 分散カウンタを使う - 制約:1 ドキュメントあたり 1 秒間に約 1 回しか更新できない - カウンタ⽤のドキュメントを複数⽤意して、ランダムにインクリメントする - 全ドキュメントを取得して合計を計算する - FieldValue.increment() を使う(v1.1.0 でリリース) - 要件によっては、Redis などでカウントするのもあり 注意点③:Cloud Firestore のデータベース設計 Cloud Firestore

Slide 63

Slide 63 text

Sansan Builders Box 1 : N ͷσʔλɿॻ͖ࠐΈ΍ಡΈࠐΈͷස౓Ͱ൑அ͢Δ - ⼀緒に扱うことが多い場合 => Array 型としてフィールドに持たせる - 1 ドキュメントあたり 1 秒間に約 1 回しか更新できない - 別々に扱うことが多い場合 => サブコレクションに持たせる - コレクションとサブコレクションにまたがったクエリはできない ※ バックエンドから使うかフロントエンドから使うかで、判断軸は異なるのではないか、と考えています Firestore で関連をどのように持つか Cloud Firestore

Slide 64

Slide 64 text

今後の課題

Slide 65

Slide 65 text

Sansan Builders Box ①:開発環境 ②:動作確認 ③:分析系クエリ ④:エラー通知 > これから整えていく 今後の課題

Slide 66

Slide 66 text

Sansan Builders Box - Cloud Firestore は 1 プロジェクトに 1 つしか DB を作れない - 開発・⾃動テスト - Cloud Tasks は Push なので、ローカルに向けられない - 開発時は Cloud Tasks をモックするか 今後の課題 ①:開発環境

Slide 67

Slide 67 text

Sansan Builders Box - Heroku Review Apps のようなことをしたい - PR ごとに環境を⽴てる - Google App Engine は複数バージョンのインスタンスを 同時に動かすことができる 今後の課題 ②:動作確認

Slide 68

Slide 68 text

Sansan Builders Box - SQL のように柔軟なクエリはない - BigQuery にデータをインポートする 今後の課題 ③:分析系クエリ

Slide 69

Slide 69 text

Sansan Builders Box - Stackdriver Error Reporting からの メール通知を Gmail のフィルタ機能で Slack に通知している - タイムラグがある - テキストをカスタマイズできない - Datadog への集約を検討 今後の課題 ④:エラー通知

Slide 70

Slide 70 text

Sansan Builders Box GCP サーバーレス サービス - 限られたリソースでもスピード感を持って開発できる - フルマネージド、オートスケールの良さを享受できる⼀⽅で、 制約やクセがある - メンバーが増えてくると、開発環境などの整備に⼯夫が必要 まとめ

Slide 71

Slide 71 text

We are hiring!

Slide 72

Slide 72 text

No content