2019年12月21日

プログラミング

サーバーレス時代のデータベース FaunaDB で GraphQL を試してみた

サーバレス時代のデータベース FaunaDB で GraphQL を試してみたサーバレス時代のデータベース FaunaDB で GraphQL を試してみた

目次

  1. はじめに
  2. FaunaDB とは
  3. 基本的な操作
  4. 外部からのアクセス
  5. 考察
  6. まとめ

はじめに

この記事は GraphQL Advent Calendar 2019 20日目および bagelee Advent Calendar 2019 21日目の記事になります。(投稿遅くなって順番前後してしまいました)

bagelee では昨日は Adobe のデザインシステム spectrum のコンポーネントについてご紹介いたしました。

Adobeのデザインシステム、spectrumから学べるデザインの基礎 ~コンポーネント編~

今日は bagelee の運営会社 palan のエンジニア進木 (@konoki_nannoki) が、 Twitter のタイムラインを見ていると頻繁に流れてくる以下のプロモーションについて調べてみました。

ホーム___Twitter.png (31.6 kB)

私は確かに普段 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 をクリックします。

Home_-_Fauna.png (33.1 kB)

適当な Database Name を入力します。まずはお試しで、 Pre-populate with demo data にチェックを入れてデモデータを投入済みのデータベースを作成してみましょう。

New_Database_-_Fauna.png (48.0 kB)

データベース内容確認

sample_-_Fauna.png (64.9 kB)

でもデータを投入したことによって、 customers, orders, products, storehouses というコレクションが作成されていることがわかります。

GraphQL から操作する

左側の GRAPHQL メニューをクリックすると GraphQL Playground が表示されます。そのページで右側の SCHEMA を押すと実際に実行可能な GraphQL のスキーマを見ることができます。

GraphQL_Playground_-_Fauna.png (140.1 kB)

スキーマを見ながら、試しに products を取得する以下のようなクエリを入力します。すでにこの時点でスキーマに沿った入力補完が有効です。

query {
  allProducts {
    data {
      name
      price
      description
    }
  }
}

真ん中の実行ボタンを押すと、データベースの中身が取得できました!

GraphQL_Playground_-_Fauna.png (128.7 kB)

外部からのアクセス

ダッシュボード上で GraphQL Playground からデータベースにアクセスできることは確認できましたが、外部からアクセスできないとデータベースとしては使えないので、その方法を試してみました。

API キーの作成

左側の SECURITY メニューを選択し NEW KEY ボタンを押します。
今回は GraphQL がリクエストできればいいので、 Role は Server にします。

Keys_-_Fauna.png (59.8 kB)

SAVE を押して作成された API Key をコピーしておきます。

リクエストを送信する

作成した API Key は API のドキュメント に書いてあるように HTTP のヘッダーに

Authorization: Bearer <secret>

としてセットします。

今回は最近 GraphQL にも対応した Postman を使ってみました。

Authorization タブで API Key をセットし、 Body タブで先程と同じクエリを入力して https://graphql.fauna.com/graphql に POST すると、外部からのリクエストで先ほどと同じ結果が返ってくることがわかります。
エンドポイントの URL はどのデータベースでも共通ですので、どのデータベースにアクセスするのかは API キーによって判断されるということになります。

Postman.png (92.4 kB)

考察

料金

料金ページ によると、 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 を用いたリアルタイム機能もロードマップに載っているようで、来年以降その名前を聞く機会が増えそうだなと思います。

1

0

AUTHOR

しんのき エンジニア

主に React Native を使ったアプリ開発と AWS や Firebase を使ったサーバーレスアーキテクチャを担当しています。元々はインフラとかPHPをやっていました。

アプリでもっと便利に!気になる記事をチェック!

記事のお気に入り登録やランキングが表示される昨日に対応!毎日の情報収集や調べ物にもっと身近なメディアになりました。

palanでは一緒に働く仲間を募集しています

正社員や業務委託、アルバイトやインターンなど雇用形態にこだわらず、
ベテランの方から業界未経験の方まで様々なかたのお力をお借りしたいと考えております。

話を聞いてみたい

運営メンバー

eishis

Eishi Saito 総務

SIerやスタートアップ、フリーランスを経て2016年11月にeishis, Inc.を設立。 マーケター・ディレクター・エンジニアなど何でも屋。 COBOLからReactまで色んなことやります。

sasakki デザイナー

アメリカの大学を卒業後、日本、シンガポールでデザイナーとして活動。

しまだ

しまだ デザイナー

WebAR/VRのデザインと3DCG制作がメインです。 肩書きは「アニメ案件に関わりたいデザイナー」。

Miu マーケター

ドイツでWEBマーケティングしています。

しんのき エンジニア

主に React Native を使ったアプリ開発と AWS や Firebase を使ったサーバーレスアーキテクチャを担当しています。元々はインフラとかPHPをやっていました。

yamakawa

やまかわたかし デザイナー

フロントエンドデザイナー。デザインからHTML / CSS、JSの実装を担当しています。最近はReact NativeやReact360をよく触っています。

furuya エンジニア

サーバーサイド、フロントエンド、Unityと色々手を出してる雑食系エンジニア。ReactNativeが最近のマイブーム。

Sayaka Osanai デザイナー

Sketchだいすきプロダクトデザイナー。シンプルだけどちょっとかわいいデザインが得意。 好きな食べものは生ハムとお寿司とカレーです。

はらた

はらた エンジニア

サーバーサイドエンジニア Ruby on Railsを使った開発を行なっています

うえまつゆい エンジニア

サーバーサイドエンジニアからフロントエンドエンジニアになりました。主にReact Nativeでのアプリ開発をしています。

kobori

こぼり ともろう エンジニア

サーバーサイドエンジニア。SIerを経て2019年7月に入社。日々学習しながらRuby on Railsを使った開発を行っています。

sasai

ささい エンジニア

フロントエンドエンジニア WebGLとReactが強みと言えるように頑張ってます。

damien

Damien

WebAR/VRを中心に企画やディレクションやエンジニアもちょっとやっています。森に住んでいます。

デザイナーゲスト

ゲスト デザイナー

CONTACT PAGE TOP