Firebase Meetup #9 Cloud Functions Day の公開用スライドです。 https://firebase-community.connpass.com/event/110958/
個人サービスでCloud FunctionsとBigQueryを組み合わせた内容の紹介をしました。
Cloud Functions × BigQueryFirebase Meetup #9Cloud Functions Day@Kesin11
View Slide
自己紹介Twitter: @Kesin11Github: Kesin11お仕事:テストや自動化の調査、啓蒙活動などFirebaseは主に趣味プロダクトで使ってますFirestoreをTypeScriptから使いやすくするラッパー作ったりしてますhttps://github.com/Kesin11/Firestore-simple2
今日の内容Cloud FunctionsからBigQueryにデータ追加Cloud FunctionsをAPIにしてBigQueryからデータ取得キャッシュの話3
Cloud FunctionsからBigQueryに保存するCloud Functions内ではサービスアカウントなどの認証無しにBigQueryのSDKを使えるBigQueryへのデータ追加の基本1レコード毎の追加はお金がかかる(ストリーミングinsert)ローカル、GCSからのcsv, jsonの一括読み込み(load)は無料4
なるべくお金を節約したいので無料のloadでデータを追加するFunctionsで一度GCSに書き出し→loadでBigQueryにデータを投入GCSにバックアップが残るのも嬉しい5
BigQueryのデータの表示FunctionsからBigQueryのSDKでクエリを実行結果を整形してjsonで返すAPIにする6
問題点分析以外の用途にはクエリ時間が厳しいBigQueryはデータ量が増えてもクエリ時間はさほど増えない逆に簡単なクエリでも数秒はかかってしまうクエリ毎に課金される走査するデータ量 x回数ユーザーから無制限に実行されてしまうのは避けたい7
キャッシュしよう8
Cloud FunctionsとCDNレスポンスヘッダーの Cache-controlでユーザーキャッシュ、CDNキャッシュが可能キャッシュにヒットすればFunctionsの実行自体が行われない用途によっては適切にキャッシュさせることでFunctionsのレスポンスや課金を改善できる今回はBigQueryのクエリ結果を返すAPIをCDNでキャッシュさせた9
ただしキャッシュは劇薬ミスすると重大事故につながることもある緊急時のためにキャッシュをパージする方法を用意しておく方が安全10
CDNキャッシュのパージHostingとFunctionsのCDNは中身が違う(と思われる)HostingはFastlycurl -svo /dev/null -H "Fastly-Debug:1" {URL}Functionsは不明Fastlyはcurl -X PURGEでパージできるFunctionsの方はパージする方法が存在するのか不明11
Hostingのrewritesを活用Hostingのrewrites設定で特定のURLをFunctionsに割り当てることが可能https:// rebase.google.com/docs/hosting/functionsこのときのFunctionsのCDNはFastlyになるがしかし、今回はダメだったBigQueryのSDKがアカウント認証のためにリダイレクトさせてるっぽい?解決できなかったのでrewritesは諦めた12
FirebaseのCDNとかCDNキャッシュについてはあまり詳しくないのでもっと詳しい人がいたら教えてくださいPURGE使わなくてもクエリパラメータとかヘッダーの工夫で実質的にパージ相当のことはできると思います13
まとめCloud Functions × BigQueryGCSを利用してFunctionsからデータ追加できるFunctionsから接続してAPI化するには工夫が必要CDNキャッシュは用法用量を守って安全にお使いください14
余談BigQueryではレコードの重複を回避するのがそこそこ大変15
BigQueryでのレコード重複回避BigQueryにはPKの概念が存在しないRDBにおけるinsert or updateが不可能前回と同じデータをloadすると重複しますload時に重複させない工夫が必要インクリメンタルなidやタイムスタンプで工夫その他の方法BigQueryでinsert or updateを実現する数百GBのデータをMySQLからBigQueryへ同期する16