コンテンツにスキップ

ハッカソンの技術選定 [サーバサイド編]

Author: Kazukichi
  • 前々回、『我々が創ってきたもの、そしてこれから』でチームの持つ思想性・哲学性の整理や反省を行った
  • 前回、『ハッカソンの要素分解』でハッカソンのプロセスに対する整理や反省を行った
  • 今回は技術選定に着眼し、これまでの反省やハッカソンで求められる技術の要件整理、そして実際に選定した技術について共有する
  • なお、筆者の担当領域がサーバサイドであることから、本記事における技術選定もサーバサイド領域に留め、他の領域の技術選定に関しては別途行う
  • なんでもかんでも自分たちで作ろうとしすぎ
    • 技術を低いレイヤからスクラッチで理解していけるというのは強み
    • 一方で、ハッカソンという限られた時間内でそれを行うのはリスキー
    • 要素技術の検証とMVPの開発は分離すべき
  • オレオレインフラ基盤によるデプロイの複雑さ
    • VPS上に構築したnginx + Docker ComposeベースのWebのデプロイ基盤
    • 当時は学生でお金がなかった他、今ほど良い選択肢もなく、生成AIもなかったので新しいデプロイ方法を学ぶ敷居が高かったという部分もある
  • 早すぎる抽象化・汎用化
    • 毎回、ゼロベースで実装したほうが早いものを、早まって抽象化・汎用化し、かえって拡張しづらく、開発速度が落ちる
  • フロントエンドエンジニアの負荷が高い
    • デプロイせずにローカルで動かすケースも多かったので、フロントエンドエンジニアもバックエンドの環境構築が必要
    • 発表前に即席でngrok等のリバースプロキシを使おうとするが、それでトラブルが起こるパターンも多かった
  • 必要な蓋然性の高い機能を当日までに準備していない
    • 認証機能とか
  • ひとえにMVP開発に適しているかどうか、ということ
  • インフラを意識しなくて良い
    • アプリケーションに集中できるようにしたい
  • 必要な技術構成が高いレベルで統合されている
    • RDB、S3互換ストレージ、認証機能、OpenAPI
  • デプロイが簡単
    • CI/CDによって自動的にデプロイされている状態が理想
  • 可能な限り、多くのメンバーが触れる言語、フレームワーク
  • ハッカソン期間を無料枠で賄える
  • アプリケーション開発に集中できるサービスとしてサーバレス(FaaS/BaaS)、PaaSがある
  • サーバレスはよりインフラを意識しないで良いことが多い傾向にある
  • サーバレスは必要な機能がBaaSという形で提供されていることが多く、実装コストも減る
  • サーバレスはコスト的にも低い印象
  • 最終的にサーバレスを使う方向性に決定
  • AWS Lambda
    • エコシステムは成熟しており、柔軟に設定・連携はできるが難易度が高め
  • Google CloudのCloud Run functions + Firebase
    • DBが基本的にRDBではない
  • Cloudflare Workers
    • 認証機能を外部に頼る必要がある(Auth0等)
  • Azure、Oracle Cloud
    • そもそもターゲットがエンプラということで選定の対象外
  • Supabase
    • RDB、S3互換ストレージ、認証機能等の機能は統合されているが、無料プランではCI/CDの整備は自力で行う必要がある
  • 共通
    • 価格は低く、ハッカソン期間であれば無料、もしくは少しかかる程度
    • 言語に関してはPython, PHP, JSをサポートしていたりしていなかったりという感じだが、バックエンドエンジニアなら一度は書いたことがあるという言語が多い
  • CI/CDの整備は自力で行うとして、最もコア機能が集約されているSupabaseを選定した
  • 今回の開発で利用、もしくは利用予定のコンポーネントのみを抜粋
  • Edge Functions
    • Denoベースで動作するFaaS
    • Denoは込み入ったことをしなければ開発体験は少し良くなったNode.jsという雰囲気
    • DenoはTypeScriptがネイティブに使用できる点も良い
  • Database
    • PostgreSQL
    • おそらくバックエンドはAWSだが、日本(東京)リージョンも選択可能
  • Storage
    • S3互換ストレージ
  • Authentication
    • Netlifyが開発したOSSの認証サーバ「GoTrue」を拡張したものらしい
    • メールアドレスとパスワードによる認証やOAuth認証、JWTの発行まで幅広くカバーしている
  • Edge Functionsをそのまま使っても基本的な処理は実現できる
  • 認証処理等のミドルウェア化等、少し複雑なことをしようとしたときに一気に複雑になる
  • oakやabc、Honoという選択肢がある
  • 日本発で日本語情報が多く、現状モダンかつポピュラーで、Laravelに近い書き味ができるHonoを採用
  • FaaSと言いつつも、単一の関数でルーティングを行い、複数のエンドポイントを配置するというアーキテクチャになる
  • SupabaseでGitHubの特定ブランチの変更を検知して自動でデプロイするGitHub integrationは無料プランでは使えない
  • GitHub Actionsを使用し、pushをトリガに内部でSupabase CLIを叩いてデプロイするという方式を採用
  • シンプルなことしかしていないので、これによってシステムの複雑さが増したりとかはほとんどない
  • 本来はHonoのサードパーティのライブラリであるZod OpenAPIを利用する予定だった
  • これはルーティングやバリデーション、ドキュメントの記述をコード内で行い、OpenAPI準拠の仕様書を自動で生成するというアプローチ
  • 実際に使ってみたが、あまり動作が安定しておらず断念
  • 手作業でOpenAPIの仕様を記述し、GitHub ActionsでRedocとして生成し、GitHub Pagesに公開するというアプローチに変更
  • ハッカソンではそこまで複雑なAPIを作ることは少なく、最近はAIが優秀なので手作業でOpenAPIを書いてもさほど苦にならないと思っている
  • フロントエンドエンジニアでも触れる可能性がある
    • 慣れ親しんだJSのスタイル(厳密にはDeno)のため
  • コールドスタートを無視できる
    • Edge Functionsはコンテナ型ではなくV8 Isolate型
    • そのため、起動が高速で、FaaSで問題になりがちなコールドスタート問題をほぼ解決している
    • ただし、言語の選択肢が少なくなる
  • 高いポータビリティ
    • SupabaseはOSSでセルフホスティングが可能
    • HonoはNode.js、Deno、Bun等、複数のランタイムで動作する
    • そのため、インフラレベル・アプリレベルでの移行が比較的、簡単にでき、ベンダロックインを防ぎやすい構造となっている
  • 昨年までに起こっていた問題の大部分は解消できたのではないかと思う
  • とはいえ、サーバサイドに慣れ親しんだ人であれば問題ないと思うが、そうでない人は別途、Honoを学習しておいたほうが良さそう
  • デザイン・フロントエンド編、ハードウェア編の技術選定もお楽しみに