SOMPO Digital Lab 開発チームブログ

安心・安全・健康に資する開発情報を発信します

【ワークショップ】re:Invent 2023 「モノリスからマルチテナントSaaS への移行」に参加しました

SOMPO Digital Lab SREの藤野です。
本日はAWS re:Invent 2023のワークショップ「モノリスからマルチテナントSaaSへの移行」に参加しました。

概要

マルチテナントSaaSを構築するため、AWS DMSを利用したDBの移行とアプリケーションレイヤーをマイクロサービス化しました。

Multi-tenant architectures provide agility and operational cost savings by sharing data storage resources for all tenants. In such an environment, isolating tenant data is a fundamental responsibility for SaaS providers. Risks are high, so it is critical to implement an effective data isolation model while retaining the agility you gain from consolidating tenants. In this workshop aimed at SaaS architects and developers, learn how you can achieve the benefits of both a shared database for your tenants and centralized isolation enforcement using Amazon Aurora, Amazon DynamoDB, AWS DMS, and Amazon QuickSight. Explore best practices for tenant isolation, partitioning, DB operations using infrastructure as code, and tenant portability.

マルチテナント アーキテクチャは、すべてのテナントでデータ、ストレージ、リソースを共有することで、アジリティを高め、運用コストを節約します。このような環境では、テナントデータを分離することが SaaS プロバイダーの基本的な責任となります。リスクは高いため、テナントを統合することで得られるアジリティを保持しながら効果的なデータ分離モデルを実装することが重要です。このSaaSアーキテクトと開発者を対象としたワークショップでは、Amazon AuroraAmazon DynamoDBAWS DMS、およびAmazon QuickSightを使用して、テナントの共有データベースの利点と集中的な分離強制の両方を実現する方法を学ぶことができます。テナントの分離、パーティショニング、IaCを使用したDB操作、およびテナント移管に関するベストプラクティスを探求してください。

学んだこと

  • スケールやパフォーマンス、コスト最適化を考慮した上で、各テナントごとにDBを分離する方法
  • 移行に伴い、扱うデータに応じて最適なDBを選定しつつ、移行コストを抑える方法
  • テナント毎の可観測性と可監査性(監査やレビューできるようログや処理手順が整理されている度合い)を向上させる方法
    • テナントが増えた場合も同様のことが言えます

ワークショップ内容

サーバーレス構成されたアプリケーションの構築から始め、DB・アプリケーションレイヤーをマイクロサービス化するための工程を一通り踏みました。

モノリスなアプリケーションから構築することで、パフォーマンスの改善比較や拡張性の増加を検証がしやすかったです。

アジェンダ

初めにモノリスアーキテクチャを構築します。バックエンドは一つのLambda関数内に集約され、DBもテナント毎に分離されていません。

ここでは次のような課題があります:

  • パフォーマンス
  • 可用性
  • 可監査性
  • 可観測性
  • ノイジーネイバー問題
  • コスト最適化

モノリス

次にマルチテナントなSaaSを構築するため、DBの移行を行います。

DBの移行にはDMSを利用しています。DMSではAurora MySQLのデータをDynamoDBにも移行できます。

次のことを実施します:

  1. テナント毎にAurora MySQL シャードを分離
  2. テナント毎に DynamoDB テーブルを分離
  3. DynamoDBのハッシュキーとレンジキーの設定
    • 今回のシナリオでは、電力会社ID#顧客ID のような形でハッシュを設定しています
  4. DMS Taskを利用し、モノリスなAurora MySQLから各シャードへデータを移行
    • パフォーマンス要件に対応するために、扱うデータセットに応じてDBを使い分けています

DB移行

最後に、モノリスで構築されたLambda関数をマイクロサービス化します。

これは特段変わったことをしていません。

1つのLambda関数から、機能ごとにLambda関数を分割しました。コードは修正を加えました。(さらっと書いていますが、モノリスのコードによってはかなりの工数が必要になる場合もあります)

マイクロサービス化

オプションでAmazon QuickSight を使用してデータを視覚化します。今回、詳細は省略しますが、各テナントは自身のデータを探索して視覚化できますが、他のテナントのデータにはアクセスできないように制御しています。

さいごに

SaaSにおけるマルチテナント化は、私自身まさに取り組んでいる最中です。

今回アプリケーションからDBの移行までを実施できたので、現在の業務にも活用していくつもりです。

コスト最適化するための具体的な事例に取り組めたことも大きな収穫でした!

ただ、認証認可やノイジーネイバー 問題までは触れることができなかったので、要件に合わせて試行錯誤していきます。