Slide 1

Slide 1 text

Cloud Functions × BigQuery Firebase Meetup #9 Cloud Functions Day @Kesin11

Slide 2

Slide 2 text

自己紹介 Twitter: @Kesin11 Github: Kesin11 お仕事: テストや自動化の調査、啓蒙活動など Firebase は主に趣味プロダクトで使ってます Firestore をTypeScript から使いやすくするラッパー作ったりしてま す https://github.com/Kesin11/Firestore-simple 2

Slide 3

Slide 3 text

今日の内容 Cloud Functions からBigQuery にデータ追加 Cloud Functions をAPI にしてBigQuery からデータ取得 キャッシュの話 3

Slide 4

Slide 4 text

Cloud Functions からBigQuery に保存する Cloud Functions 内ではサービスアカウントなどの認証無しに BigQuery のSDK を使える BigQuery へのデータ追加の基本 1 レコード毎の追加はお金がかかる(ストリーミングinsert ) ローカル、GCS からのcsv, json の一括読み込み(load )は無料 4

Slide 5

Slide 5 text

なるべくお金を節約したいので 無料のload でデータを追加する Functions で一度GCS に書き出し→load でBigQuery にデータを投入 GCS にバックアップが残るのも嬉しい 5

Slide 6

Slide 6 text

BigQuery のデータの表示 Functions からBigQuery のSDK でクエリを実行 結果を整形してjson で返すAPI にする 6

Slide 7

Slide 7 text

問題点 分析以外の用途にはクエリ時間が厳しい BigQuery はデータ量が増えてもクエリ時間はさほど増えない 逆に簡単なクエリでも数秒はかかってしまう クエリ毎に課金される 走査するデータ量 x 回数 ユーザーから無制限に実行されてしまうのは避けたい 7

Slide 8

Slide 8 text

キャッシュしよう 8

Slide 9

Slide 9 text

Cloud Functions とCDN レスポンスヘッダーの Cache-control でユーザーキャッシュ、CDN キ ャッシュが可能 キャッシュにヒットすればFunctions の実行自体が行われない 用途によっては適切にキャッシュさせることでFunctions のレスポ ンスや課金を改善できる 今回はBigQuery のクエリ結果を返すAPI をCDN でキャッシュさせた 9

Slide 10

Slide 10 text

ただしキャッシュは劇薬 ミスすると重大事故につながることもある 緊急時のためにキャッシュをパージする方法を用意しておく方が 安全 10

Slide 11

Slide 11 text

CDN キャッシュのパージ Hosting とFunctions のCDN は中身が違う(と思われる) Hosting はFastly curl -svo /dev/null -H "Fastly-Debug:1" {URL} Functions は不明 Fastly はcurl -X PURGE でパージできる Functions の方はパージする方法が存在するのか不明 11

Slide 12

Slide 12 text

Hosting のrewrites を活用 Hosting のrewrites 設定で特定のURL をFunctions に割り当てることが 可能 https:// rebase.google.com/docs/hosting/functions このときのFunctions のCDN はFastly になる がしかし、今回はダメだった BigQuery のSDK がアカウント認証のためにリダイレクトさせてる っぽい? 解決できなかったのでrewrites は諦めた 12

Slide 13

Slide 13 text

Firebase のCDN とかCDN キャッシュについてはあ まり詳しくないので もっと詳しい人がいたら教えてください PURGE 使わなくてもクエリパラメータとかヘッダーの工夫で実質的にパージ相 当のことはできると思います 13

Slide 14

Slide 14 text

まとめ Cloud Functions × BigQuery GCS を利用してFunctions からデータ追加できる Functions から接続してAPI 化するには工夫が必要 CDN キャッシュは用法用量を守って安全にお使いください 14

Slide 15

Slide 15 text

余談 BigQuery ではレコードの重複を回避するのがそこ そこ大変 15

Slide 16

Slide 16 text

BigQuery でのレコード重複回避 BigQuery にはPK の概念が存在しない RDB におけるinsert or update が不可能 前回と同じデータをload すると重複します load 時に重複させない工夫が必要 インクリメンタルなid やタイムスタンプで工夫 その他の方法 BigQuery でinsert or update を実現する 数百GB のデータをMySQL からBigQuery へ同期する 16