2019年12月21日
プログラミング
サーバーレス時代のデータベース FaunaDB で GraphQL を試してみた
はじめに
この記事は GraphQL Advent Calendar 2019 20日目および bagelee Advent Calendar 2019 21日目の記事になります。(投稿遅くなって順番前後してしまいました)
bagelee では昨日は Adobe のデザインシステム spectrum のコンポーネントについてご紹介いたしました。
今日は bagelee の運営会社 palan のエンジニア進木 (@konoki_nannoki) が、 Twitter のタイムラインを見ていると頻繁に流れてくる以下のプロモーションについて調べてみました。
私は確かに普段 JavaScript を使って開発していますし、そのための情報源として Twitter も活用していますので非常に正しいターゲティングです。しかもツイートには何やら JavaScript と相性が良いデータベースがあるらしいということが辛うじて読み取れるだけで他には何も書かれていないのが、プロモーションの術中にまんまとハマって悔しいですが気になってしまいました。
そんな謎に包まれたデータベース、 FaunaDB の正体に迫ってみました。
FaunaDB とは
公式ページ によると FaunaDB は 元 Twitter のエンジニアの Evan Weaver と Matt Freels によって立ち上げられたクラウドデータベースサービスです。
企業紹介のページに熱いミッションが書かれていたのでご紹介します。筆者が意訳したところもあるので、正しくは 原文 を参照ください。
ミッション
長い間、アプリケーション開発においてデータベースは一番のボトルネックでした。データベースはデプロイが面倒で、使うのが難しく、さらには彼らのルールに従うことをアプリケーションに強いてきました。我々のミッションはあなたたちをこのボトルネックから解放し、安心して、今まで受け入れざるを得なかったような限界や制約を取っ払って、アプリケーションを開発できるようになることです。
(中略)
FaunaDB はサーバレス時代のためにつくられたクラウドデータベースです。スケーラブルで、グローバルで、セキュアで、信頼性があり、それでいて強整合性 (Strong Consistency) を持っています。モダンな GraphQL API と FQL という専用の言語を組み合わせることで高い生産性を持った開発体験を提供します。それでいて素晴らしいことに、 FaunaDB はオペレーションを必要としません。
我々は「動的アプリケーションを作るためのデータベースは FaunaDB だけあればいい」と言われるようになるように尽くします。そして同時に、顧客とそこに関わる人々に価値を提供し続ける会社であるよう尽くします。
心が震えますね。(ルールを強いないと言っているのにFQLという独自言語使ってるのにはつっこみたくなりましたが)
実際サーバレスアーキテクチャにおけるデータベースは林立しており、インフラ面の課題を乗り越えるために実装上の制約を強いられることがほとんどですので、そこを乗り越えてスタンダードを狙いにきている感じがあります。
詳しい技術的なところは What is FaunaDB? のページに書かれています。2012年に発表された Calvin というデータベースの論文をベースに作られたようです。
基本的な操作
それでは FaunaDB を実際に使ってみましょう。
登録、ログイン
こちら から会員登録できます。無料枠で使うのであればクレジットカードは不要で、 GitHub アカウントがあれば数クリックで登録が完了します。
データベース作成
ダッシュボード上で NEW DATABASE
をクリックします。
適当な Database Name
を入力します。まずはお試しで、 Pre-populate with demo data
にチェックを入れてデモデータを投入済みのデータベースを作成してみましょう。
データベース内容確認
でもデータを投入したことによって、 customers
, orders
, products
, storehouses
というコレクションが作成されていることがわかります。
GraphQL から操作する
左側の GRAPHQL
メニューをクリックすると GraphQL Playground が表示されます。そのページで右側の SCHEMA
を押すと実際に実行可能な GraphQL のスキーマを見ることができます。
スキーマを見ながら、試しに products
を取得する以下のようなクエリを入力します。すでにこの時点でスキーマに沿った入力補完が有効です。
query {
allProducts {
data {
name
price
description
}
}
}
真ん中の実行ボタンを押すと、データベースの中身が取得できました!
外部からのアクセス
ダッシュボード上で GraphQL Playground からデータベースにアクセスできることは確認できましたが、外部からアクセスできないとデータベースとしては使えないので、その方法を試してみました。
API キーの作成
左側の SECURITY
メニューを選択し NEW KEY
ボタンを押します。
今回は GraphQL がリクエストできればいいので、 Role は Server
にします。
SAVE
を押して作成された API Key をコピーしておきます。
リクエストを送信する
作成した API Key は API のドキュメント に書いてあるように HTTP のヘッダーに
Authorization: Bearer <secret>
としてセットします。
今回は最近 GraphQL にも対応した Postman を使ってみました。
Authorization タブで API Key をセットし、 Body タブで先程と同じクエリを入力して https://graphql.fauna.com/graphql
に POST すると、外部からのリクエストで先ほどと同じ結果が返ってくることがわかります。
エンドポイントの URL はどのデータベースでも共通ですので、どのデータベースにアクセスするのかは API キーによって判断されるということになります。
考察
料金
料金ページ によると、 5GB のストレージ、及び1日あたり 100K read ops, 50K write ops, 50MB のデータ転送は無料枠に含まれていて、それを超える場合従量課金か定額課金か選べるようになっています。
単純な比較はできませんが、参考までにこの値は Cloud Firestore の無料枠 よりも全てのスペックが倍以上なので、無料枠としては十分そうです。
認証認可
今回見た Server Key をクライアントに渡して直接 FaunaDB にアクセスさせてしまうと自由にクエリが発行できてしまい、セキュリティが担保できなくなります。
セキュリティのページ に権限を絞った Client Key について触れられていますが、実際に試せてはいないのですがそこまで柔軟には設定出来ないかなと思いました。
複雑な認証認可を行いたい場合中間に Server Key を持たせた GraphQL サーバーを立てて 、そこ経由でアクセスをするのが良さそうです。これは Prisma 等でも使われる方法です。
リレーション
リレーションのページ を見る限り基本的なリレーションは GraphQL 上で表現できるようです。実際の使い勝手は本格的に使ってみないとわかりません。
まとめ
調査するまではなんだか怪しいと思っていた FaunaDB ですが、サーバーレス時代のデータベースを自称するに相応しい機能を備えている素晴らしいデータベースであることが分かりました。
データベースとしての競合は Cloud Firestore 、 マネージド GraphQL サーバーとしての競合は AWS AppSync や Heroku 上にデプロイされた Prisma や Hasura あたりになりそうです。
すでに Netlify 連携 や ZEIT Now 連携 もあり、 GraphQL 連携のアナウンスページ によると GraphQL Subscription を用いたリアルタイム機能もロードマップに載っているようで、来年以降その名前を聞く機会が増えそうだなと思います。
プログラミングのお仕事に関するご相談
Bageleeの運営会社、palanではプログラミングに関するお仕事のご相談を無料で承っております。
zoomなどのオンラインミーティング、お電話、貴社への訪問、いずれも可能です。
ぜひお気軽にご相談ください。
この記事は
参考になりましたか?
4
0
関連記事
簡単に自分で作れるWebAR
「palanAR」はオンラインで簡単に作れるWebAR作成ツールです。WebARとはアプリを使用せずに、Webサイト上でARを体験できる新しい技術です。
palanARへpalanでは一緒に働く仲間を募集しています
正社員や業務委託、アルバイトやインターンなど雇用形態にこだわらず、
ベテランの方から業界未経験の方まで様々なかたのお力をお借りしたいと考えております。
運営メンバー
Eishi Saito 総務
SIerやスタートアップ、フリーランスを経て2016年11月にpalan(旧eishis)を設立。 マーケター・ディレクター・エンジニアなど何でも屋。 COBOLからReactまで色んなことやります。
sasakki デザイナー
アメリカの大学を卒業後、日本、シンガポールでデザイナーとして活動。
やまかわたかし デザイナー
フロントエンドデザイナー。デザインからHTML / CSS、JSの実装を担当しています。最近はReactやReact Nativeをよく触っています。
Sayaka Osanai デザイナー
Sketchだいすきプロダクトデザイナー。シンプルだけどちょっとかわいいデザインが得意。 好きな食べものは生ハムとお寿司とカレーです。
はらた エンジニア
サーバーサイドエンジニア Ruby on Railsを使った開発を行なっています
こぼり ともろう エンジニア
サーバーサイドエンジニア。SIerを経て2019年7月に入社。日々学習しながらRuby on Railsを使った開発を行っています。
ささい エンジニア
フロントエンドエンジニア WebGLとReactが強みと言えるように頑張ってます。
Damien
WebAR/VRの企画・開発をやっています。森に住んでいます。
ゲスト bagelee
かっきー
まりな
suzuki
miyagi
ogawa
雑食デザイナー。UI/UXデザインやコーディング、時々フロントエンドやってます。最近はARも。
いわもと
デザイナーをしています。 好きな食べ物はラーメンです。
taishi kobari
フロントエンドの開発を主に担当してます。Blitz.js好きです。
kubota shogo
サーバーサイドエンジニア。Ruby on Railsを使った開発を行いつつ月500kmほど走っています!
nishi tomoya
aihara
グラフィックデザイナーから、フロントエンドエンジニアになりました。最近はWebAR/VRの開発や、Blender、Unityを触っています。モノづくりとワンコが好きです。
nagao
SIerを経てアプリのエンジニアに。xR業界に興味があり、unityを使って開発をしたりしています。
Kainuma
サーバーサイドエンジニア Ruby on Railsを使った開発を行なっています
sugimoto
asama
ando
iwasawa ayane
yoko oshimo
異業界からやってきたデザイナー。palanARのUIをメインに担当してます。これからたくさん吸収していきます!