マルチテナントSaaSにおける技術選定
はじめに
マーケティング領域でSaaSを開発しています。近年はマーケティングに限らずVertial SaaSの領域が盛り上がっており、BtoB向けにマルチテナントなSaaSを開発する際の技術選定について記事にしてみました。
基本構成
本プロダクトでは、AWSを中心に開発を行っています。限られたリソースの中で、最大限開発を進めていくためには、なるべくマネージド/サーバレスなものを選択しており、組織の方針によってはこの限りではないので、ご了承ください。
要素技術(バックエンド)
Aurora Serverless v2 PostgreSQL
PostgreSQL
テナント間のデータの分離という、重大なセキュリティの問題に対しては、PostgreSQLのRow Level Securityを使用します。Row Level Security(以下、RLS)はPostgreSQLが提供する権限の一部として、接続ユーザーに対して操作できる行を制限できる機能です。テナントごとに適切にポリシーを設定することで、同じクエリでも、所属するテナントごとに異なる結果を返すことができます。
AWSのブログでもマルチテナントなSaaSプロバイダー向けのアーキテクチャとしてRLSを利用するパターンが紹介されています。
本技術の採用にあったっては、SansanとSmart HRの事例を参考にしました。
Aurora Serverless v2
AuroraというAWSが独自で開発したDBエンジンを搭載したサービス(Aurora)で、実務で発生するDBのメンテナンス作業や負荷に応じたDBインスタンスのスケーリング管理が不要(Serverless)なデータベースサービスです。スケーラビリティ、可用性、耐久性に優れ、マルチAZにも対応しています。
PostGraphile
GraphQL
GraphQLの最大の利点として、単一のAPIエンドポイントを通じて、あらゆるデータにアクセスすることができます。またリゾルバーとしても有用で、フロントエンドの開発体験を向上できます。
なぜPostGraphileなのか
AWSのマネージドなGraphQLサービスであるAppSync、実績の多いHasuraもありますが、RLSに対応しているGraphQLはPostGraphile一択だったため、これに決まりました。またPostgres内のデータスキーマを自動で読み込んでくれる上に、カスタムで関数を定義することもできます。
JWTsを介すことでRLSによる制御を実現します。
Golang
以下の理由で、バックエンドのメイン言語にGolangを選択しました。
- サーバーレス/コンテナとの相性が良い
- 静的型付け言語で、大規模なチーム開発にも向いている
- 実行が早く、パフォーマンスがいい
ECS on Fargate
コンテナ運用の基盤としてのECS、実行環境としてFargateを選択しました。
ECS or EKS
Kubernetesの知見やマルチクラウドの構想がある場合には、EKSという選択肢もあると思います。Kubernetes自体は素晴らしい技術ですし、コミュニティも巨大なので、OSSやそういったエコシステムの恩恵も受けられると思います。ただ、Kubernetesを中心に開発する場合は、EKSのバージョンアップ対応がつらいのと、より歴史の長いGKE(or GKE Autopilot)を使うためにGCPを選択すると思います。
ECSもAWSの他のサービスとの連携が豊富にあるため、AWSの様々なサービスの恩恵を受けることができます。
Fargate or EC2
2019年のFargateの値下げ以降、実行環境にFargateを選択する会社が多いです。EC2よりも若干高いですが、リソースを効率よく使えるのと、OSの管理が必要なくなるので、運用コストを大幅に下げることができます。
要素技術(フロントエンド)
フロントエンドでは、バックエンドほどマルチテナントSaaSにとってクリティカルな要件がないので、コミュニティの大きさや流行、人の採用などを考慮して以下の技術を中心に開発しています。
- NextJS
- 大規模開発向きのReactベースのフロントエンドフレームワーク
- Typescript
- 静的型付け言語
- Tailwind CSS
- utility classを活用したCSSフレームワーク
- Mantine UI
- ReactのUIライブラリ
- AWS Amplify
- フロントエンドのデプロイ環境
- AuthJS(旧NextAuth)
- オープンソースのユーザ認証ライブラリ
最後に
BtoBマルチテナントSaaSを開発する際の技術選定について解説しました。あまりサンプルが少ないですが、PostgresのRLS + PostGraphileは自分の関わっているSaaSでもかなり開発体験がよく、この領域における次のデファクトスタンダードになるのではないかと思います。
最後になりますが、シード期のスタートアップで最先端の開発環境に興味があるという方、気軽にご連絡いただけると嬉しいです!
フィシルコムのテックブログです。マーケティングSaaSを開発しています。 マイクロサービス・AWS・NextJS・Golang・GraphQLに関する発信が多めです。 カジュアル面談はこちら(ficilcom.notion.site/bbceed45c3e8471691ee4076250cd4b1)から
Discussion