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

Cloud Functions × BigQuery

Kenta Kase
January 17, 2019

Cloud Functions × BigQuery

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

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

Kenta Kase

January 17, 2019
Tweet

More Decks by Kenta Kase

Other Decks in Technology

Transcript

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

    View full-size slide

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

    https://github.com/Kesin11/Firestore-simple
    2

    View full-size slide

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

    View full-size slide

  4. Cloud Functions
    からBigQuery
    に保存する
    Cloud Functions
    内ではサービスアカウントなどの認証無しに
    BigQuery
    のSDK
    を使える
    BigQuery
    へのデータ追加の基本
    1
    レコード毎の追加はお金がかかる(ストリーミングinsert

    ローカル、GCS
    からのcsv, json
    の一括読み込み(load
    )は無料
    4

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  8. キャッシュしよう
    8

    View full-size slide

  9. Cloud Functions
    とCDN
    レスポンスヘッダーの Cache-control
    でユーザーキャッシュ、CDN

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide