Slide 1

Slide 1 text

Firebase Realtime Databaseとは? GCPUG Firebase Realtime Database /meetup/1 @k2wanko

Slide 2

Slide 2 text

コキチーズ @k2wanko GCPUGのスタッフ L社セキュリティエンジニア Go言語とGCP好き JavaScriptも少し書ける Firebase エンジョイ勢 Splatoonエンジョイ勢(S+) SW-4038-0559-8402

Slide 3

Slide 3 text

Realtime Databaseとは?

Slide 4

Slide 4 text

RDBではないデータベース

Slide 5

Slide 5 text

Realtime Database リアルタイムにデータを同期してくれる フルマネージドのNoSQLデータベース SDKを利用してクライアントから直接データの 読み書きが可能 オフラインでも読み書き可能 オンラインになった時データが同期される 一つのJSONオブジェクトの様な形式 アクセス制御はセキュリティルールという仕組 みがある

Slide 6

Slide 6 text

100,000 有料プランでの同時接続数

Slide 7

Slide 7 text

どういう用途に向いているか

Slide 8

Slide 8 text

用途 ● チャット ● 共同編集できるメモ ● ターン制のようなゲーム (ボードゲームなど) ● タスクキュー

Slide 9

Slide 9 text

向いていないもの ● 容量の多いドキュメントの保存 ● FPSなどの大量のデータが流れる ゲームなど

Slide 10

Slide 10 text

対応プラットフォーム Android iOSはもちろん、 Webブラウザでも使えるし オフライン対応もしている またUnityやC++(Cocos2dx用?) サポートもある ドキュメントにはないが arduinoもライブラリ(公式)が存在する firebase/firebase-arduino もし対応しているプラットフォームが なくてもREST APIがあるのでHTTPで 操作できるしイベントをストリームで 受け取れる

Slide 11

Slide 11 text

データの構造化

Slide 12

Slide 12 text

データの構造化 Realtime Databaseでは 1つのJSONオブジェクトのような形で 保存される。 深さは32レベルまで Realtime DatabaseへのQueryは トップの要素がヒットするとその下に 連なる全てのオブジェクトを取得する そのためネストを深くすると パフォーマンスが悪化する。 フラットな構造を心がけよう!

Slide 13

Slide 13 text

Threadと Messageの例 /threads/thread_id/messages/-K0/text ではなく /threads/thread_id /messages/thread_id/message_id/text のようにフラットにする。 そうしないと Threadの情報を取るためだけに 全てのメッセージを取得してしまう

Slide 14

Slide 14 text

データの保護とセキュリティ

Slide 15

Slide 15 text

セキュリティルール セキュリティルールは JSONで記述する。 read,writeオペレーションはマッチした ルールのみ実行される。 記述方法 コンソールの https://console.firebase.google.com/u/0 /project/{projectId}/database/rules で書くか firebase-toolsを使ってローカルで 書いてデプロイする方法がある 後者のがバージョン管理できるので オススメ

Slide 16

Slide 16 text

.read .write .readと.writeは名前の通り 読み取る権限と 書き込む権限を制御する 図の例だと/users/{$uid}/に対して 認証したユーザーと同じ uidの場合 書き込めるというルールになる。 fooというuidのユーザがいたら /users/fooへは書き込めるが /users/barには書き込めない またこのルールは上位の設定が優先さ れるので /users/foo/bar や /users/foo/hoge/hoge などには自由に書 き込める

Slide 17

Slide 17 text

.validate .validateは値が適切なフォーマットかどう かを制御する。 例では/fooへの書き込む値が 文字列であり100文字以内であるかを検 証する。 newDataはこれから書き込まれる値のス ナップショットで.val()は実際の値

Slide 18

Slide 18 text

$ variables $付きのものは変数としてデータの 検証に利用できる。 例では/users/fooへの書き込み時に $uidにfooが代入され auth.uidと一致するか検証できる authは認証情報が詰まってる 詳しくはドキュメントへ https://firebase.google.com/docs/refere nce/security/database/#auth

Slide 19

Slide 19 text

$other $otherは特殊な命令で 定義したpathにマッチしなかった 場合にマッチする。 なので例では/foo以外にマッチしなかっ た場合にマッチするので /foo以外には書 き込めない 用途としてはユーザーに好きな プロパティを生やして書き込まれないよう にするなどに利用する。

Slide 20

Slide 20 text

ところでJSONで書くの 辛くないですか?

Slide 21

Slide 21 text

Firebase Blaze

Slide 22

Slide 22 text

Firebase Blaze セキュリティルールを YAMLで書いて コンパイルすると セキュリティルールの JSONになる コンパイラ https://github.com/firebase/blaze_comp iler 関数などを定義できる (使ったことはない)

Slide 23

Slide 23 text

Firebase Bolt

Slide 24

Slide 24 text

Firebase Bolt セキュリティルールを書くための言語 コンパイルすると セキュリティルールの JSONになる 型を定義できるし 関数が使えるしコメントも書ける https://github.com/firebase/bolt VSCodeにPluginがある

Slide 25

Slide 25 text

Firebase Bolt はいいぞ!

Slide 26

Slide 26 text

Cloud Functions

Slide 27

Slide 27 text

Cloud Functions 様々なイベントをトリガーに実行する Node.jsのホスティングサービス RealtimeDatabaseでは書き込みを 元に実行できる 今まではonWriteで新規作成も アップデートも削除も 同じように呼ばれてたが onCreate onUpdate onDelete が追加されて無駄に Functionsを 実行しないようできるようになった https://firebase.googleblog.com/2017/0 7/cloud-functions-realtime-database.ht ml

Slide 28

Slide 28 text

Functionsの注意点 /fooへの書き込みをトリガーにしていて /foo自身のvalueをFunctionsで 書き換えるとまたイベントが発生する なので繰り返し書き込んで 無限ループにならないようにする 必要がある またフリープランでは Googleのネットワーク外への リクエストはできない

Slide 29

Slide 29 text

料金 (2017/8/28)

Slide 30

Slide 30 text

Spark(フリー) - 同時接続 100 - 1GBのストレージ - 月10GBのダウンロード

Slide 31

Slide 31 text

Flame 月$25 (定額) - 同時接続 100K - 2.5GBのストレージ - 月20GBのダウンロード

Slide 32

Slide 32 text

Blaze(従量課金) - 同時接続 100K - 月5GB/$5 のストレージ - 月5GB/$5 のダウンロード - Sparkと同じだけの無料枠あり

Slide 33

Slide 33 text

超高い

Slide 34

Slide 34 text

個人的な思い Realtime Databaseにデータを 保存するのは向いていないので Queueとして使い 実際のデータはDatastoreへ保存する Realtime DatabaseのKeyと遂になるよう にするのがよいかも

Slide 35

Slide 35 text

Cloud Datastore ● スケーラビリティの優れたNoSQL ● メンテナンスで落ちるとかない ● 書き込みも読み込みもストレージも安い ○ ストレージ 月1GB/$0.18 ○ Realtime Databaseと比べると5分の1 ○ 1GBの無料枠あり ● Cloud Functionsからも読み書き可能

Slide 36

Slide 36 text

Tips

Slide 37

Slide 37 text

ドキュメントの見方 ● 公式ドキュメントのURL https://firebase.google.com/docs/database/ ● 英語版を読む場合は下の方にある言語設定を 英語にするか ● URLのQueryにhl=enと付ける。 https://firebase.google.com/docs/database/?hl=en ● 最新の情報は英語にしかない

Slide 38

Slide 38 text

障害について RealtimeDatabaseは よくインシデントが発生している (GCPUG/#incidents_jaで確認できる) NSSはデータベースのサーバ名 curl https://.firebaseio.com/.set tings/owner.json で確認できる

Slide 39

Slide 39 text

わからないことは? GCPUGのSlackの #firebase_ja で 聞こう! コキチーズは 日本語版スタックオーバフローも サブスクリプションしてます (リアルタイムではない)

Slide 40

Slide 40 text

Enjoy Realtime Database!