第13回 マルチテナント検索基盤 -- 一つのFessで複数組織をサービスする設計

はじめに

Fess を社内の複数部門や、MSP(マネージドサービスプロバイダー)として複数の顧客に提供したい場合、テナントごとに Fess を個別に構築するのは非効率です。

本記事では、一つの Fess インスタンスで複数のテナント(組織・部門・顧客)にサービスを提供するマルチテナント設計を解説します。

対象読者

  • 複数の組織や部門に検索サービスを提供したい方

  • Fess のマルチテナント設計に興味がある方

  • バーチャルホスト機能の活用方法を知りたい方

シナリオ

グループ企業の IT 部門が、3つの子会社に検索サービスを提供するケースを想定します。

テナント構成
テナント ドメイン 検索対象
A社(製造業) search-a.example.com 製品仕様書、品質管理文書
B社(小売業) search-b.example.com 店舗マニュアル、商品情報
C社(サービス業) search-c.example.com 顧客対応マニュアル、FAQ

各テナントには以下の要件があります。

  • テナント間でデータが見えてはいけない(データ分離)

  • テナントごとに異なるデザイン(ブランディング)

  • テナントごとに独立したクロール設定

バーチャルホスト機能

Fess のバーチャルホスト機能を使うと、アクセスするホスト名に応じて異なる検索体験を提供できます。

バーチャルホストの設定

管理画面でバーチャルホストの値を設定します。 この値は、クロール設定やラベルに紐づけることで、テナントごとのデータ分離を実現します。

設計のポイント

DNS / ロードバランサ設定

各テナントのドメインが同じ Fess サーバーを指すように DNS を設定します。

search-a.example.com → Fess サーバー (192.168.1.100)
search-b.example.com → Fess サーバー (192.168.1.100)
search-c.example.com → Fess サーバー (192.168.1.100)

Fess はリクエストの HTTP ヘッダーを見て、どのバーチャルホストへのアクセスかを判別します。 デフォルトでは Host ヘッダーが使われますが、virtual.host.headers 設定で任意のヘッダーを指定できます。 設定形式は ヘッダー名:値=バーチャルホストキー です(例: Host:search-a.example.com=tenant-a)。

テナント分離の設計

データ分離

テナント間のデータ分離は、バーチャルホスト機能によるドキュメントの virtual_host フィールドで実現します。

バーチャルホストによる分離

クロール設定の「バーチャルホスト」フィールドにバーチャルホストキーを設定すると、クロールされたドキュメントに virtual_host フィールドが付与されます。 検索時にはこのフィールドで自動的にフィルタリングされ、各テナントのドメインでアクセスした利用者には、そのテナントのドキュメントのみが検索結果に表示されます。

  • tenant-a: A社のドキュメント

  • tenant-b: B社のドキュメント

  • tenant-c: C社のドキュメント

また、ラベルの「バーチャルホスト」フィールドも設定することで、テナントごとに表示するラベルも分離できます。

ロールによる分離

さらに厳密な分離が必要な場合は、ロールベース検索(第5回参照)を組み合わせます。 テナントごとのロールを作成し、クロール設定とユーザーに割り当てます。

クロール設定の分離

各テナントのクロール設定は独立して管理します。

テナント別クロール設定
テナント クロール対象 スケジュール ラベル
A社 smb://fs-a/docs/ 毎日 1:00 tenant-a
B社 https://portal-b.example.com/ 毎日 2:00 tenant-b
C社 smb://fs-c/manuals/ 毎日 3:00 tenant-c

テナント別テーマ

Fess のテーマ機能を使って、テナントごとに異なるデザインを提供できます。

テーマの設計

各テナントのブランドカラーやロゴに合わせたテーマを用意します。

  • A社: 製造業らしい堅実なデザイン(青系)

  • B社: 小売業の明るいデザイン(緑系)

  • C社: サービス業の親しみやすいデザイン(オレンジ系)

バーチャルホストとテーマの連携

バーチャルホストごとにテーマを切り替えることで、各テナントの利用者には自社ブランドの検索画面が表示されます。

Fess は simpledocsearchcodesearch などの組み込みテーマの他、カスタムテーマも利用可能です。

API アクセスの分離

テナントごとの API アクセストークン

各テナントに個別のアクセストークンを発行します。 トークンにロールを紐づけることで、API 経由のアクセスもテナント分離が適用されます。

アクセストークン設定
テナント トークン名 割り当てロール
A社 tenant-a-api-token tenant-a-role
B社 tenant-b-api-token tenant-b-role
C社 tenant-c-api-token tenant-c-role

各テナントのシステムが API 連携する場合(第11回参照)、テナント固有のトークンを使用することで、他テナントのデータにアクセスできないことが保証されます。

運用上の考慮点

リソース管理

一つの Fess インスタンスで複数テナントをサービスするため、リソースの配分に注意が必要です。

  • クロールの負荷分散: テナントのクロールスケジュールを分散させ、同時実行を避ける

  • インデックスサイズ: テナント全体のインデックスサイズを監視

  • メモリ: テナント数とドキュメント数に応じて JVM ヒープを調整

テナントの追加・削除

新しいテナントを追加する際の手順を標準化しておきましょう。

  1. ラベルの作成

  2. ロールの作成

  3. クロール設定の登録

  4. バーチャルホストの設定

  5. アクセストークンの発行

  6. DNS 設定の追加

テナントを削除する際は、関連するインデックスデータの削除も忘れずに行います。

スケールの判断基準

以下のような兆候が見られたら、Fess インスタンスの分割やスケーリング(第14回参照)を検討します。

  • 検索のレスポンスタイムが悪化

  • クロールがスケジュール内に完了しない

  • メモリ不足のエラーが頻発

  • テナント数が10を超える

まとめ

本記事では、Fess のバーチャルホスト機能を活用したマルチテナント設計を解説しました。

  • バーチャルホストによるテナント別アクセスの実現

  • ラベルとロールによるデータ分離

  • テナント別テーマによるブランディング

  • API アクセストークンによるテナント分離

  • リソース管理とスケールの判断基準

一つの Fess インスタンスで効率よく複数テナントにサービスを提供し、管理コストを抑えながら各テナントの要件に応えることができます。

次回は、検索システムのスケール戦略について扱います。

参考資料