OCIでアプリケーションをSaaSifyする方法 (2026/02/10)
OCIでアプリケーションをSaaSifyする方法 (2026/02/10)
https://blogs.oracle.com/cloud-infrastructure/how-to-saasify-applications-on-oci
投稿者: Gururaj Mohan | Master Principal Cloud Architect
今日のクラウドファーストの世界では、企業や独立系ソフトウェアベンダー(ISV)が従来型のアプリケーションをSaaS(Software as a Service)へと移行するケースが増えています。この変革において重要な要素となるのが、マルチテナント・デプロイメント・モデルです。このモデルでは、複数の顧客がセキュリティ、パフォーマンス、そしてコスト効率を確保しながら、同じアプリケーションを共有できます。Oracle Cloud Infrastructure(OCI)は、共有テナンシーとハイブリッド・アプローチを用いたSaaSアプリケーションの容易な提供を可能にする、堅牢なサービスセットを提供します。
テナンシーについて
OCI テナンシーと SaaS アプリケーションのテナントの概念を混同しないことが重要です。
OCIテナンシー:OCIサービスにサインアップすると付与されるアカウントです。これはルートアカウントを表し、OCIリソースを整理・管理するための安全で分離されたパーティションとして機能します。
テナント (SaaSのコンテキスト):ISVがOCI上にSaaSプラットフォームを構築するとします。ISVが自社の顧客をプラットフォームにプロビジョニングする際、各顧客はテナントとみなされます。ここで言うテナントとは、顧客組織を表し、各テナントには複数のユーザーが関連付けられる場合があります。
つまり、OCI テナンシーは OCI アカウント自体を指し、テナントは ISV などの別のエンティティによって OCI 上でホストされているアプリケーションを使用する組織 (SaaS 顧客など) を指します。
アーキテクチャ
このアーキテクチャは、OCI 上のマルチテナント アプリケーション デプロイメント モデルを高レベルで表します。
次の図は、このリファレンス アーキテクチャを示しています。

この柔軟なアーキテクチャは、次の 3 つの層で構成されています。
| 層 | 目的 | キーアクション |
|---|---|---|
| 初期認証(OCI IAM) | グローバルIDを確認する | 資格情報の検証後にJSON Web Token(JWT)を発行する |
| 認証ミドルウェア | リクエストごとにIDを確認する | JWT からテナントとユーザーのコンテキストを抽出する |
| データアクセス層またはORMフック | データ分離を強制する | すべてのクエリを自動的にフィルタリング tenant_id |
各レイヤーについては以下で説明します。
初期認証とテナントコンテキストの確立
- 認証サービス: 通常、ユーザーはテナント固有の URL (mycompany.app.com など) を使用するか、ログイン時にテナントを選択してログインします。
- OCI Identity and Access Management (OCI IAM) をアイデンティティプロバイダーとして使用: OCI IAM (具体的には 専用のアイデンティティドメイン) はユーザーの資格情報を検証します。重要なのは、ユーザーが有効であるだけでなく、アクセスしようとしている特定のテナントグループ (例: mycompany-users) のメンバーであることを確認することです。
- JWT 発行: 認証が成功すると、OCI IAM アイデンティティドメインは署名付きの JSON Web Token (JWT) を発行します。このトークンには、以下の重要なクレームが含まれます。
- sub : ユーザーの一意の識別子。
- groups : ユーザーが所属するIAMグループのOCIDの配列。これはテナントを識別するためのキーとなります。
tenant_idまたはなど の カスタムクレームは、tenant_nameOCI IAM のカスタム属性を使用して追加できます。(オプション)
認証ミドルウェア – 「Who」層
バックエンドは、テナントコンテキストを安全に抽出・伝播するように設計する必要があります。このアーキテクチャは、OCI API GatewayまたはOCI Load Balancerのいずれかを使用して、リクエストごとの認証とテナントコンテキストの伝播を実行できます。
- OCI API Gateway:推奨されるエントリポイント です 。JWT検証を自ら実行することで、アプリケーションコードの負担を軽減します。OCI IAMアイデンティティドメインのJWKSエンドポイントに対して署名を検証するように設定してください。
- OCI ロード バランサ: SSL 終了とルーティングを処理できますが、検証のために JWT を認証ミドルウェアに渡します。
アクション: OCI API GatewayはJWTの署名と有効期限を検証します。無効な場合は、リクエストを直ちに拒否します。有効な場合は、リクエストを上流のサービスに転送し、検証済みのトークンまたは抽出されたクレームをヘッダー(例: X-USER-ID、 X-TENANT-ID)に渡すことがよくあります。
OCI API Gateway の代わりに OCI Load Balancer を使用している場合、アプリケーション バックエンドの最初のコンポーネントは認証ミドルウェアである必要があります。
アクション:ヘッダー から JWT を抽出し Authorization: Bearer <token> 、OCI IAM の公開キーを使用して署名を検証し、クレームをデコードして、 後続のすべてのレイヤーが使用できるようにuser_id and tenant_id (groups クレームから派生) をリクエスト コンテキストに挿入します。
データアクセス層またはオブジェクトリレーショナルマッパー(ORM)フック – 「何」の層
このレイヤーは、すべての SQL クエリにテナント ID を自動的に挿入します。
- 例: への呼び出しは
getAllInvoices()に変換されますSELECT * FROM invoices WHERE tenant_id = :tenant_id。 - 強制: 人為的なエラーを回避するには、集中型のデータ アクセス層または ORM (Hibernate など) フック、または「テナント対応」接続プールによって強制するのが最適です。
- ORM フック: アプリケーション フレームワーク レベルでデータベース操作をインターセプトして変更することで、真の暗黙的なテナント分離を可能にするメカニズム。
テナントデータ分離戦略:
このアーキテクチャは、テナントのデータを分離して保護するための 2 つのオプションをサポートしています。
オプション1: アプリケーションレベル
ORM フック/スコープ: Hibernate (Java)、Django ORM (Python)、Eloquent (PHP) などのフレームワークを使用すると、特定のモデルのすべてのクエリにテナント フィルターを自動的に追加するグローバル スコープを定義できます。
または
オプション2: データベースレベル
識別子列、テナントごとの個別のスキーマ、またはテナントごとの個別のデータベースを使用できます。
- 識別子列(最も一般的):テナント固有のテーブルまたはドキュメントごとに列
tenant_idが追加されます。アプリケーションのデータアクセス層(DAL)またはORMは、WHERE tenant_id = ?すべてのクエリに句を自動的に追加する役割を担います。これは、以下の方法で実現されます。 - テナントごとのスキーマ:各テナントには、同じデータベース インスタンス内に専用のデータベース スキーマがあります。テナント ID に基づくアプリケーション ロジックは、データベース接続の現在のスキーマを切り替える必要があります。
- テナントごとのデータベース:各テナントには、企業向けの Bring Your Own Keys Encryption を備えた、物理的に独立した独自のデータベース インスタンスがあります。アプリケーションには、 正しいデータベース接続文字列に マップするための テナント データ検索サービスが
tenant_id必要です 。このオプションには利点と欠点があります。
考慮事項
このアーキテクチャを展開するときは、次のオプションを考慮してください。
- パフォーマンス:
- 安全:
- コスト:ビジネスニーズに基づいて、テーブルレベル、スキーマレベル、あるいはエンタープライズレベルのお客様向けの専用データベースが必要かどうかを評価します。例:
- パッチ適用とアプリケーションアップデート単一インスタンス、マルチテナントのSaaSアーキテクチャでは、すべてのテナントにパッチを適用せずに1つのテナントにパッチを適用することはできません。すべての顧客が同じアプリケーションコードベース、ランタイム、インフラストラクチャを共有しています。この現実は、大きな課題を生み出します。ユーザーベース全体に混乱をもたらすダウンタイムを発生させることなく、安全かつ効率的にアップデートを展開するにはどうすればよいでしょうか?その答えは、この目的のために特別に設計された最新のDevOpsデプロイメント戦略にあります。ゼロダウンタイムのデプロイメント戦略を使用することで、ユーザーをオフラインにすることなく、バージョン間のシームレスな移行が可能になります。ユーザーに必須のアップグレード期間を通知します(例:「アップグレード日が指定されていない場合、アップグレードは日曜日の12:00(mm/dd/yyyy)に自動的に実行されます」)。期間終了後、旧バージョンのセッションを終了し、すべてのトラフィックを新バージョンにリダイレクトします。その後、旧アプリケーションコードは完全にシャットダウンされます。
- データベースに関する考慮事項アプリケーションのバージョンを切り替えると同時にデータベーススキーマを切り替えることはできません。多くのSaaS企業は、以下の方法でこれを回避しています。これにより、ロールアウト中に新しいコードを古いスキーマ バージョンに対して安全に操作できるようになり、ダウンタイムなしの移行と即時のロールバックが可能になります。
行動喚起
アプリケーションをモダナイズし、スケーラブルなサブスクリプションベースのSaaSモデルへの移行をご検討中ですか?Oracle Cloud Infrastructure(OCI)は、SaaSトランスフォーメーションを加速するために必要なパフォーマンス、セキュリティ、そしてコスト効率を提供します。
次のステップに進みましょう。現在のアーキテクチャを評価し、SaaSへの対応におけるギャップを特定し、OCIサービスがアプリケーションのモダナイズ、拡張、そしてSaaSプラットフォームとしての運用にどのように役立つかを検討し始めましょう。
さらに深く掘り下げたり、実際の実装方法について議論したい場合は、お気軽にお問い合わせください。
さらに詳しく
マルチテナント アプリケーションの展開について詳しく説明します。
以下の追加リソースを確認してください。
コメント
コメントを投稿