📑

個人開発でHasuraを使ったらものすごい早さでリリースできた

2023/05/13に公開

はじめに

フルスタックエンジニアとして0→1のプロダクトを何個も作ってきましたが、様々な失敗を経て柔軟なバックエンドを簡単に構築する方法を自分なりに確立したので共有したいと思います。

柔軟でスケーラブルなバックエンドを簡単に作りたい

個人開発では使えるリソースが少なく工数を削減したいところです。データを出したり入れたりしたいだけなのにバックエンドのコード記述量が多すぎる不満がありAWS Amplify、Firebase、Supabase、appwire、Hasuraと様々なBaasを検証、本番に導入してみました。

結論、Hasuraが以下の点で優れていました。

  • Postgresを始めとする様々なRDBMSが使える
  • データの出し入れをGraphQLで簡単に行うという点のみにフォーカスしているのでシンプルである
  • シンプルゆえにストレージはS3、認証はKeycloak、サブスクリプションはStripeといった柔軟な構成が可能である
  • 安価に使えるCloud環境が用意されていて、セルフホスティングも可能で移行も簡単である

使用するDBは以下の点からPostgresを選びました。

Hasuraとは

Hausraは任意のデータベースのテーブル構造を元に、コードを書かずにGraphQLサーバーを構築することができるOSSです。

GUIから設定するだけでTodoアプリのようなログインしたユーザーが作成したレコードだけ見えて、更新、削除ができる機能を作成できます。

ログインしていないユーザーがクエリできるようにしたり、グループの権限をつける機能もありデータの出し入れに関わるユースケースはHasuraだけで達成できます。

加えて後述するPostgresの機能を使えばさらに複雑なユースケースも対応できます。

Hasuraの基本的な使い方については以下の公式で解説されているので参考にしてみてください。

(https://hasura.io/learn/ja/graphql/hasura/introduction/)

Postgresで複雑なユースケースに対応する

HasuraはテーブルからGraphQLを生やすのみです。単純なINSERTやSELECTをするだけのユースケースならGUIからポチポチするだけで完成しますが課題となるのは複雑なユースケースです。

Hasuraでは以下の方法が用意されています。

下2つはHasuraから別のエンドポイントを叩くことで特定のユースケースを達成する機能です。つまり、サーバーを準備し、コードを書く必要があります。コードは書けば書くほどバグり、環境をまたぐことで管理が煩雑になります。

なのでPostgresのみでユースケースを達成することができるPostgres: Extend Schemaをできるだけ使うべきだと考えます。

Postgres: Extend SchemaはPostgresのFUNCTIONをGraphQLから叩けるようにする機能です。

PostgresのFUNCTIONは機能が多いのでテーブルAからデータを取って変数に入れてIFで処理を分岐なども書けます。

PL/pgSQLについては以下が参考になりました。

https://www.amazon.co.jp/わたしとぼくのPL-pgSQL-技術の泉シリーズ(NextPublishing)-目黒-聖-ebook/dp/B07NQGNFDP/ref=sr_1_1?__mk_ja_JP=カタカナ&crid=2IGR7UDLFGLT9&keywords=PL%2FpgSQL&qid=1683956802&sprefix=pl%2Fpgsql%2Caps%2C168&sr=8-1
https://qiita.com/ester41/items/3401606322888a0a7f21

ちなみにpgTAPを使えばテストも書けます。

http://pgsqldeepdive.blogspot.com/2012/12/pgtappostgresql.html

Postgresでプレゼンテーション層まで対応する

PostgresはViewが使えます。ViewはSELECTの結果を仮想テーブルにする機能で元のテーブルが更新されれば追従します。

https://qiita.com/yutoun/items/355ac403237b05a063a3

HasuraはViewに対応しています。つまり、フロントエンドで表示しやすい形にテーブルを組み直すことができプレゼンテーション層のような振る舞いをさせることができます。

Postgresのみで対応できないユースケースはどうするか

例えばStripeで決済をする場合など、APIと通信する必要がある場合はリモートスキーマなどで外部で対応する必要があります。

まとめ

LaravelやRuby on Railsと比べてコード記述量は1/100くらいに減り、バグも少なく運用できています。

そんなこんなでHasuraを使って開発したWebサービスをリリースしました!

https://konjac.ai/ja

Youtubeや動画ファイルを文字起こしして、翻訳し字幕をつけることができるサービスです。

以下翻訳サンプルです!

https://konjac.ai/ja/demo/ncc-en-to-ja-edge-computing

https://konjac.ai/ja/demo/en-to-ja-seo

登録後7日間無料なので是非使ってみてもらえると嬉しいです。

Discussion