📑

マルチテナントSaaSにおける技術選定

2022/12/16に公開

はじめに

マーケティング領域でSaaSを開発しています。近年はマーケティングに限らずVertial SaaSの領域が盛り上がっており、BtoB向けにマルチテナントなSaaSを開発する際の技術選定について記事にしてみました。

基本構成

本プロダクトでは、AWSを中心に開発を行っています。限られたリソースの中で、最大限開発を進めていくためには、なるべくマネージド/サーバレスなものを選択しており、組織の方針によってはこの限りではないので、ご了承ください。

要素技術(バックエンド)

Aurora Serverless v2 PostgreSQL

PostgreSQL

テナント間のデータの分離という、重大なセキュリティの問題に対しては、PostgreSQLのRow Level Securityを使用します。Row Level Security(以下、RLS)はPostgreSQLが提供する権限の一部として、接続ユーザーに対して操作できる行を制限できる機能です。テナントごとに適切にポリシーを設定することで、同じクエリでも、所属するテナントごとに異なる結果を返すことができます。

AWSのブログでもマルチテナントなSaaSプロバイダー向けのアーキテクチャとしてRLSを利用するパターンが紹介されています。
https://aws.amazon.com/jp/blogs/news/multi-tenant-data-isolation-with-postgresql-row-level-security/

本技術の採用にあったっては、SansanとSmart HRの事例を参考にしました。
https://buildersbox.corp-sansan.com/entry/2021/05/10/110000
https://tech.smarthr.jp/entry/2022/02/15/202241

Aurora Serverless v2

https://aws.amazon.com/jp/about-aws/whats-new/2022/04/amazon-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による制御を実現します。
https://www.graphile.org/postgraphile/security/

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でもかなり開発体験がよく、この領域における次のデファクトスタンダードになるのではないかと思います。
最後になりますが、シード期のスタートアップで最先端の開発環境に興味があるという方、気軽にご連絡いただけると嬉しいです!

https://herp.careers/v1/ficilcom

フィシルコム

Discussion