Hasuraで遊んでみる ~その1~

2021.09.21

Hasuraとは、

自身の持っているデータに対して、即座にGraphQLとREST APIを提供してくれるサービスです。 Hasura Cloud上でのフルマネージド、またはセルフホスト型のサービスを選択できます。

サーバーレスアーキテクチャを採用している場合、DBへのアクセスには何かしらのAPIを別途用意することが多いと思いますが、Hasuraを使用することによりAPIの開発や保守にかかっている時間を短縮を図れると言われています。

※ データにアクセスするときのイメージ

サポートされているDBとAPI

現在は、DBでは PostgreSQL, MS SQL Server, BigQuery, Citusがサポートされているようです。

MySQLはベータ版として提供されていました。

APIは GraphQLとRESTがサポートされています。

料金

上記リンクに値段と機能比較が掲載されています。

Freeプランもあるので、ちょっと試したり個人利用するにはありがたいですね。

やってみる

HasuraCloudでFreeプランを使って試していきます。

こちら からサインアップすることですぐに使えるようになります

コンソールにアクセス

サインアップ後、プロジェクトが作成されるのでLaunch Consoleをクリックします

データベース接続を作る

コンソールにアクセス後、上部のDataをクリックします。

既存のデータベースか、新たにデータベースを作成する(Heroku上に作成)かが選択できます。

今回はAWS上に作成した既存のデータベース(RDS for PostgreSQL)に接続してみましょう。

Hasuraのコンソールで以下のように接続情報を記入し、接続を作成します。

※ 接続に失敗する方は、セキュリティグループでHasura Cloud IPを許可されているか確認します

接続が作成されると、以下のような画面にリダイレクトされます。

コンソールからテーブルを作成

Hasuraのコンソールを使って、接続したDBにテーブルを作ってみます

Create table ボタンを押して入力ページに遷移します。

テーブル名やカラムを追加してきましょう。

テーブルを追加したら、Insert Row タブをクリックしてデータを追加してみます

クエリしてみる

データを作ったら、今度はクエリを実行してデータを取得してみます

ヘッダーメニューにあるAPIをクリックします。

コンソールのGraphiQLタブを開き、以下の構文でクエリを作って実行してみます。

query {
  テーブル名 {
    カラム名
  }
}

実行後、以下のように登録したデータが結果として返ってきます

whereやorderbyなんかもできますので試してみましょう

例)

quer {
  テーブル名(where: {カラム名: {_gte: "1000"}}, order_by: {カラム名: desc}) {
    カラム名
  }
}

リレーション

RDBを使っているのでリレーションも試してみます。

商品カテゴリーのテーブルを作成し、商品テーブルにcategory_idという名前の外部キーを作成してみましょう。

作成後、商品テーブルのページを開き,Relationshipsタブをクリックし、設定していきます。

商品テーブルのcategory_idとカテゴリーテーブルのidを使ってリレーションを作成してみます。

リレーションシップのクエリを実行するには、以下のような構文で行います。

{
  テーブル名 {
    カラム名
    作成したリレーションシップ名 {
      カラム名
    }
  }
}

このようにカテゴリーの情報も一緒に返ってきますね

REST APIの作成

GraphQL APIでの実行は確認できたので、今度は REST APIを作ってデータを取得できるか確認してみます。

API -> RESTをクリックします。

仕組みとしては、エンドポイントにリクエストがきたらGraphQLを実行してデータを返しているみたいです。

エンドポイントは、GraphiQLを使って、GraphQLのクエリから作成することができます。

開いたページにあるリンクからGraphiQLの画面に遷移し、クエリを作成します。

今回は商品の一覧を取得するクエリを作成してみました。

クエリれい)

query items {
  shop1_items(where: {published: {_eq: 0}, item_and_category: {published: {_eq: 0}}}) {
    id
    name
    price
    item_and_category {
      id
      name
    }
  }
}

データが返ってきていることが確認できたら、RESTをクリックします。

Name、Description,Location,Methods,GraphQL Requestを設定しましょう。

今回はLocationをitemsにし、GETでアクセスするエンドポイントを作ってみました。

作成後、REST Endpointsの画面から作ったエンドポイントのリンクをクリックします。

Run Requestボタンを押してリクエストを送信できます。

期待通りの結果が返ってきているか確認してみましょう。

※ x-hasura-admin-secretを送信しないとエラーになりました

まとめ

Hasuraをクラウドでデプロイして、既存データベースへの接続、テーブル作成、データ挿入、GraphQL APIの実行、REST APIの作成などを行ってみました。

使いこなせば確かにアプリとデータのやり取りにかかる時間や労力が軽減されるのではないでしょうか。

今回はシンプルな実行を試しましたが、実際に動くアプリケーションでは承認や認証、ビジネスロジックなども含まれるかと思います。

次回以降にその辺も含めて遊んでいきたいと思います

参考

hasuraのチュートリアル