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

Cloud Functions × BigQuery

9bcd328daf60fe29dc9970f6cfc26730?s=47 Kenta Kase
January 17, 2019

Cloud Functions × BigQuery

Firebase Meetup #9 Cloud Functions Day の公開用スライドです。
https://firebase-community.connpass.com/event/110958/

個人サービスでCloud FunctionsとBigQueryを組み合わせた内容の紹介をしました。

9bcd328daf60fe29dc9970f6cfc26730?s=128

Kenta Kase

January 17, 2019
Tweet

Transcript

  1. Cloud Functions × BigQuery Firebase Meetup #9 Cloud Functions Day

    @Kesin11
  2. 自己紹介 Twitter: @Kesin11 Github: Kesin11 お仕事: テストや自動化の調査、啓蒙活動など Firebase は主に趣味プロダクトで使ってます Firestore

    をTypeScript から使いやすくするラッパー作ったりしてま す https://github.com/Kesin11/Firestore-simple 2
  3. 今日の内容 Cloud Functions からBigQuery にデータ追加 Cloud Functions をAPI にしてBigQuery からデータ取得

    キャッシュの話 3
  4. Cloud Functions からBigQuery に保存する Cloud Functions 内ではサービスアカウントなどの認証無しに BigQuery のSDK を使える

    BigQuery へのデータ追加の基本 1 レコード毎の追加はお金がかかる(ストリーミングinsert ) ローカル、GCS からのcsv, json の一括読み込み(load )は無料 4
  5. なるべくお金を節約したいので 無料のload でデータを追加する Functions で一度GCS に書き出し→load でBigQuery にデータを投入 GCS にバックアップが残るのも嬉しい

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

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

    7
  8. キャッシュしよう 8

  9. Cloud Functions とCDN レスポンスヘッダーの Cache-control でユーザーキャッシュ、CDN キ ャッシュが可能 キャッシュにヒットすればFunctions の実行自体が行われない

    用途によっては適切にキャッシュさせることでFunctions のレスポ ンスや課金を改善できる 今回はBigQuery のクエリ結果を返すAPI をCDN でキャッシュさせた 9
  10. ただしキャッシュは劇薬 ミスすると重大事故につながることもある 緊急時のためにキャッシュをパージする方法を用意しておく方が 安全 10

  11. CDN キャッシュのパージ Hosting とFunctions のCDN は中身が違う(と思われる) Hosting はFastly curl -svo

    /dev/null -H "Fastly-Debug:1" {URL} Functions は不明 Fastly はcurl -X PURGE でパージできる Functions の方はパージする方法が存在するのか不明 11
  12. Hosting のrewrites を活用 Hosting のrewrites 設定で特定のURL をFunctions に割り当てることが 可能 https://

    rebase.google.com/docs/hosting/functions このときのFunctions のCDN はFastly になる がしかし、今回はダメだった BigQuery のSDK がアカウント認証のためにリダイレクトさせてる っぽい? 解決できなかったのでrewrites は諦めた 12
  13. Firebase のCDN とかCDN キャッシュについてはあ まり詳しくないので もっと詳しい人がいたら教えてください PURGE 使わなくてもクエリパラメータとかヘッダーの工夫で実質的にパージ相 当のことはできると思います 13

  14. まとめ Cloud Functions × BigQuery GCS を利用してFunctions からデータ追加できる Functions から接続してAPI

    化するには工夫が必要 CDN キャッシュは用法用量を守って安全にお使いください 14
  15. 余談 BigQuery ではレコードの重複を回避するのがそこ そこ大変 15

  16. BigQuery でのレコード重複回避 BigQuery にはPK の概念が存在しない RDB におけるinsert or update が不可能

    前回と同じデータをload すると重複します load 時に重複させない工夫が必要 インクリメンタルなid やタイムスタンプで工夫 その他の方法 BigQuery でinsert or update を実現する 数百GB のデータをMySQL からBigQuery へ同期する 16