Hasuraの概要
概要
Hasuraはオープンソースで開発されているGraphQLサーバー
PostgreSQLなどのデータベースエンジンのスキーマから認証とアクセス制御を備えた CRUD + リアルタイム GraphQL API を提供してくれる
集計用のリゾルバ(aggregate)やupsert mutationも自動で用意してくれる
基本的な機能
DB操作がHasura上で完結
Hasuraでは付属しているWebコンソール画面でテーブル・カラムの作成・編集が可能
SQLエディタがも用意されているのでSQLを書いたり、データの閲覧・追加・削除も全てこのWebコンソール画面で完結できる
テーアブル間のリレーションやPermissionの設定もできる
Actions
カスタムクエリーやミューテーションを使ったカスタムビジネスロジックで、Hasuraのスキーマを拡張する方法
アクションをHasuraに追加することで、データの検証、外部ソースからのデータリッチメント、その他の複雑なビジネスロジックなど、様々なユースケースを処理することができる
特にRESTエンドポイントを呼び出す際に使用することが多い
サーバーレス機能をリゾルバとして設定する際に便利
Remote Schemas
リモートの GraphQL スキーマをマージして、統合された GraphQL API を提供する機能
この機能を使ってNestで実装したGraphQLサーバーを組み合わせることができる
統合元のスキーマと区別せずにアクセスすることができる
複雑なビジネスロジックや重い処理はNestでそれ以外の簡単なものはHasuraで自動生成みたいな感じでできる
Event Triggers
データベース内のテーブルにイベントトリガーを作成するために使用することができる
イベントトリガーは、指定されたテーブルのイベントを確実に捕捉し、HTTPウェブフックを呼び出して、カスタムロジックを実行する
用途としては会員データ登録後のユーザー通知といったポーリングするほど高頻度でないDB更新で処理が開始されるケースなど
イベントの種類
INSERT: テーブルに行が挿入されるとき
UPDATE: テーブルの行が更新されるとき
DELETE: テーブルから行が削除されるとき
MANUAL: コンソールまたはAPIを使用して、行に対して手動でイベントを発生させることができる
Data Federation
データ連携機能により、独立したデータストアに存在する、意味的に関連性のある異なるソースのデータを合成することができる
これは、複数のデータソースから単一のGraphQLスキーマを作成することによって行われ、それによってデータアクセスプロセスがセルフサービスとなり、カスタムコードを書くことなくサービス間でリアルタイムにクエリー、変異、フェデレーション、ストリームデータを行うことができるようになる
リモートデータソースは、データベースソースのテーブル、リモートスキーマとして追加されたGraphQL API、またはアクションとして追加されたREST APIのいずれかにすることができる
データベースのテーブル、リモートスキーマ、アクションのタイプ間の関係を作成したら、GraphQLクエリを実行することで、それらの間でデータを「結合」することができる
Scheduled Triggers
スケジュールトリガーは、特定の時点でカスタムビジネスロジックを実行するために使用される
コンソールでイベントのステータスやログが確認できる
リトライ回数やインターバル、リトライ期限も設定できるのでジョブ管理サーバーとしても使える
Migrations Metadata
Hasuraの設定を説明するために、2つの情報を必要としている
- Migrations: 基礎となるデータベーススキーマを表現
- Metadata: 公開されたHasura GraphQL APIと他の全ての設定を記述
MigrationsはCI/CDと組み合わせて使用すると、データベーススキーマの変更を、アプリの開発版、ステージング版、実稼働版に自動的かつエレガントに適用することができます。
MetadataはHasuraサーバーの設定を表すもも。アクションからデータベースとそのテーブル、パーミッション、イベントトリガー、API制限まで、Hasuraサーバーの設定に関するすべてがメタデータで表現されている
バージョンコントロールで追跡することもでき、コードやデータベーススキーマの変更と同期して、Hasuraメタデータを維持することができる
Hasura CLI を使って、Hasura サーバーに全体として適用することができる
認証・認可機能が組み込みでサポートされている
JWT ベースの認証・認可を簡単に設定することができ、テーブルのカラム単位でのCRUDの許可・不許可を細かく設定できる
Remote Schemas にはフィールド単位で制限をかけることができる
Discussion