Hasuraで既存のPostgreSQLから爆速でGraphQL APIサーバーを構築する

Hasuraで既存のPostgreSQLのDBから爆速でGraphQLのAPIサーバーを構築出来たのでその内容を備忘録としてまとめます。

本記事は以下のような方を対象にしています。

* HerokuのPostgres add-onを利用してアプリのDBを構築している
* GraphQLでのAPIサーバーを試したい
* でもリゾルバとかTypeDefをイチから書くのは面倒

# Hasuraとは？
https://hasura.io/

`Instant realtime GraphQL engine` とドキュメントでは紹介されていますが、
ざっくり言うとPostgreSQLからGraphQL APIサーバーを自動で構築するものです。

公式の以下図の通り、DBであるPostgreSQLと、GraphQLのAPIを使うクライントとの間に入り、GraphQLとSQL（or JSON）を相互変換してくれます。

![f7a4cfcf2813970ee1350efc9d748c79.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/e17474af-5f5b-1e87-d438-e2b4dcacbb99.gif)
（[公式サイトより](https://hasura.io/)）

# Hasuraサーバーの構築

Hasuraを立ち上げる方法は、DockerやHerokuなどあるのですが、本記事ではローカル環境を作らずお手軽に使えるHerokuを利用します。

まず、HasuraのドキュメントページからHerokuAppの作成を行います
https://docs.hasura.io/1.0/graphql/manual/getting-started/heroku-simple.html

![スクリーンショット 2019-11-24 21.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/e0294fcf-d890-59f7-1db5-7490444e069b.png)

Herokuが開かれるので、適宜ログインすると以下画面になるはずです。
App Nameのところに任意の名前を入力してDeploy Appを実行してください。

![スクリーンショット 2019-11-24 21.09.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/99eafff9-845f-7bc9-1818-90d752c98cd1.png)

これでDeploy完了まで待てばHasuraが任意のURLで構築されるはずです。
早い..!!!

![スクリーンショット 2019-11-24 21.41.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/a2d84908-d4a4-f228-e9d5-2a720c85c49f.png)

# 既存のPostgreSQLとの接続
次に本記事の主目的である既存のPostgreSQLとの接続を行います。
公式ドキュメントの以下内容です。

https://docs.hasura.io/1.0/graphql/manual/deployment/heroku/using-existing-heroku-database.html

## PostgresQLアドオンの削除
まず、前項で作成したHasuraサーバーに自動で組み込まれているAddonであるHeroku Postgresを削除します。
Herokuのダッシュボードから作成したアプリケーションを選択して、以下画面にてDellete Add-onを実行してください。

![スクリーンショット 2019-11-24 21.44.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/e1e4695d-e877-416c-de73-ce7bb73757a2.png)

削除の確認があるので、作成したアプリ名を入力して、Remove add-onを実行します。

![スクリーンショット 2019-11-24 21.46.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/25fbff5d-d5b1-a51d-cda8-ad7c6640a0da.png)

これで初期構築のPostgresの削除が完了します。
この状態で先程のHasuraの画面を開くと、Application errorが発生しているはずです。

![スクリーンショット 2019-11-24 21.48.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/5bfe61d5-51c0-ade6-650d-17c700fe5c2f.png)

## 環境変数でのDB指定

次に、接続したいHeroku上の既存PostgreSQLのURLを変数として設定します。
指定するURIは、既存のPostgres add-onのsettings、Database Credentialsから取得できます。

![スクリーンショット 2019-11-24 21.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/f6a0056b-caaa-4098-c555-5b6078aec2cf.png)

取得したURIをHasuraを立ててるHeroku AppのSettings, Config Varsにて`DATABASE_URL`として指定します。

![スクリーンショット 2019-11-24 21.57.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/e5c5811c-7398-b289-1af9-eba08df6170e.png)

これで、既存のPostgreSQLの方の方で認証が通っていればDBが接続されます。
この状態で、再度HasuraのURLを表示すると起動しているはずです。

![スクリーンショット 2019-11-24 21.59.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/564a063d-25f5-f241-669a-ba8fd0628608.png)

これでもうGraphQLのクエリにてテーブルのデータを参照できます。

## Table情報のインポート（もし、自動インポートされていなかったら）
通常だと前項までの作業で、TableのデータがインポートされてGraphQLのスキーマが構築されるのですが、もし構築されていなかったら、HasuraのDATAより、TrackTableを行ってください。

（添付画像では表示されないですが、ここらへんにTrack Tableが出るはず）
![スクリーンショット 2019-11-24 22.02.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/df738233-b05e-a99b-a954-452f81b83b88.png)

## クエリを実行

早速コンソールから実行してみましょう。
このようにテーブルの構造をもとにGraphQLのAPIが構築されています。

![スクリーンショット 2019-11-24 22.04.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/2c0ad1d6-baa1-f19f-6b69-e7ace75a87f6.png)
（スクショのデータは全てFakerで作ったダミーです）

もちろんダッシュボード以外でも、エンドポイントのURLを指定すれば実行できます。

以下GraphQL Playgroundでの実行例
![スクリーンショット 2019-11-24 22.06.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/7b78ca72-4627-434b-aef3-006617a3458a.png)

また、単純なカラムの取得以外のクエリについても最初から自動構築されています。

* 合計・平均・総数などを取得するaggregateのクエリ
* primary_key指定でリソースを取得する by_keyクエリ

などなど、またそれぞれについても、リゾルバを一行も書かずにpagingや、order、whereに対応しています。

![スクリーンショット 2019-11-24 22.12.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/230b4a08-ed3d-93dd-043b-75f2fe20518e.png)

凄い!!

# 終わりに

これ全て一からやっても15分程で、リゾルバやTypeDefなどサーバーサイドを一行も書かずに、GraphQL APIサーバーが構築出来ます。
本当に便利ですね。

ただ、実運用に必要なセキュリティ的な設定（ComplexityやDepth）など、エンドポイントの認証認可の設定までは行ってないので、今後調べてまた記事にしていきたいです。

以上、Hasuraで既存のPostgresQLから爆速でGraphQL APIサーバーを構築する でした。