Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

Platformのエンジニアが行くAWS re:Invent 2023 - EKSで実現するマルチテナントSaaS編

こんにちは、技術本部研究開発部 ML Platformチームの神林です。前回はEKSのBreakout Sessionの中で気になる一部分を掘り下げてみました。

buildersbox.corp-sansan.com

AWS re:Invent 2023も無事に終わりました。開催中にもう何個か記事を書きたかったのですが、なかなか時間が取れずに終わってしまいました。忘れないうちに気になるものを取り上げて書き残しておこうと思います。

ExpoのRed HatブースでRed Hatをかぶる人たち

二日目は「SaaS multi-tenancy meets Amazon EKS: A hands-on deep dive」というWorkshopに参加しました。Session Levelは三段階中最高レベルの400 - Expertです。このレベルの理由はおそらくKubernetesやIstio等については予め知っている前提で進めるからでしょう。SaaSにおけるマルチテナントのアーキテクチャをEKSで実装してみようという内容のハンズオンでした。

Workshopの雰囲気

大体のWorkshopは二時間で行います。Workshopによって違いがあるようですが、私の参加したものはすべて一人でもくもくとドキュメントを見ながら進めていくタイプでした。分からなければ周りを徘徊しているSolution Architectに質問します。のんびり理解しながらやっていると半分くらいしかできません。しかもWorkshopによっては、終了後一定時間経つとドキュメントが参照できなくなってしまいます。スピード勝負でかなり忙しいです。

幸い今回のWorkshopは実施後に資料が公開されたため、これをベースにして振り返ってみることにします。

catalog.us-east-1.prod.workshops.aws

Workshopで使用するコード等はこちらに公開されています。

github.com

あまり詳しく書くと翻訳になってしまうので、ざっくりとした概要を拾っていきます。

テナント分離戦略

EKSでテナントの分離を考えるに当たって、コンピュートリソースの中での分離を考える水平軸の分離と、コンピュートリソースの外のレイヤー(例えばストレージレイヤー)等の分離も考える垂直軸の分離があります。

水平軸

水平の軸では、テナント分離を考慮しないPooled tenant、Namespaceレベルで分離するNamespace per tenant、Nodeレベルで分離するNodes per tenantという3つのパターンがあります。

3つのパターンを図示したものがこちらです。

このWorkshopではNamespace per tenantの実装にNetworkPolicyやサービスメッシュであるIstioのAuthorizationPolicyリソースを使ったネットワークレベルの分離を実現していたり、Node per tenantの実装にクラスターオートスケーラーのKarpenterを使用して、Taints、TolerationsのペアやNodeAffinityを使ったNode分離を行っていました。

垂直軸

垂直軸についてはまずCognitoが発行するJWTを使って分離を達成するために必要なテナントのコンテキストを取得するようにしています。また、IRSA*1をNamespaceデフォルトのService Accoutに適用することで、Podからクラスター外のリソースへのアクセスをNamespace毎に制御する方法を使っていました。

トラフィックルーティング

IstioのIngress GatewayとVirtual Serviceを使ってリクエストをどのPodに向けるかを制御しています。また、JWTの検証のためにIstioのRequestAuthenticationリソースを使った方法が示されていました。

モニタリングとスケーリング

NamespaceレベルのリソースであるLimitRangeを使って、テナント毎のPodやコンテナの計算リソースのデフォルト値を設定、制限を行っています。スケーリングに関してはHorizontalPodAutoscalerを導入してスケールアウトの挙動を確かめ、PrometheusとGrafaraをクラスターにインストールしてメトリクスの取得、可視化をしていました。

別のWorkshopの様子

おわりに

SaaSマルチテナントアーキテクチャの実装をEKSで行うために、なんとなくこのへんの機能を使ったらできそうだなというのは想像できていましたが、実際に体系化されたドキュメントをハンズオン形式で進めることによって、マルチテナントの設計に自信が持てるようになりました。なかなか書籍にもなりにくいコンテンツなので非常に勉強になりました。繰り返し読んで自分のものにしていこうと思います。

研究開発部ではEKSを使い倒しているMLOps/DevOpsエンジニアを募集しています。

open.talentio.com

*1:IAM Role for Service Account

© Sansan, Inc.