テナントごとのアプリケーション SaaS パターンを使用して、新しいテナントのプロビジョニングとカタログ化を行います

適用対象:Azure SQL Database

この記事では、テナントごとのスタンドアロン アプリ SaaS パターンを使用する新しいテナントのプロビジョニングとカタログ化について説明します。 この記事には、2 つの主要な部分があります。

  • 新しいテナントのプロビジョニングとカタログ化についての概念的な説明
  • プロビジョニングおよびカタログ化を実現するサンプル PowerShell コードをハイライトするチュートリアル
    • チュートリアルでは、テナントごとのスタンドアロン アプリ パターンに適合する Wingtip Tickets サンプル SaaS アプリケーションを使用します。

テナントごとのスタンドアロン アプリケーション パターン

テナントごとのスタンドアロン アプリ パターンは、マルチテナント SaaS アプリケーションのさまざまなパターンのうちの 1 つです。 このパターンでは、各テナントに対してスタンドアロン アプリがプロビジョニングされます。 アプリケーションは、アプリケーション レベルのコンポーネントと Azure SQL Database で構成されます。 各テナントのアプリは、ベンダーのサブスクリプション内にデプロイできます。 または、アプリをテナントのサブスクリプション内にデプロイし、テナントに代わってベンダーが管理できるマネージド アプリケーション プログラムが Azure で提供されています。

app-per-tenant pattern

テナント用のアプリケーションをデプロイする場合、アプリとデータベースは、テナント用に作成された新しいリソース グループにプロビジョニングされます。 別々のリソース グループの使用によって、各テナントのアプリケーション リソースが分離され、個別に管理できます。 各リソース グループ内で、各アプリケーション インスタンスは、対応するデータベースに直接アクセスするように構成されます。 この接続モデルは、カタログを使用してアプリとデータベース間の接続を仲介する他のパターンとは対照的です。 リソースは共有されないため、各テナントのデータベースは、ピーク時の負荷を処理するのに十分なリソースでプロビジョニングされる必要があります。 このパターンは、テナントの分離が重要であり、リソースのコストがそれほど重要ではない、テナント数が少ない SaaS アプリケーションで使用される傾向があります。

テナントごとのアプリケーション パターンでのテナント カタログの使用

各テナントのアプリとデータベースは完全に分離されますが、テナント間でさまざまな管理と分析のシナリオが適用される可能性があります。 たとえば、アプリケーションの新しいリリースに対してスキーマの変更を適用するには、各テナント データベースのスキーマを変更する必要があります。 レポートと分析のシナリオでは、デプロイ場所に関係なく、すべてのテナント データベースへのアクセスが必要な場合もあります。

Diagram that shows how to use a tenant catalog with the application per tenant pattern.

テナント カタログは、テナント ID とテナント データベース間のマッピングを保持することで、ID をサーバーとデータベース名に解決できます。 Wingtip SaaS アプリでは、テナント ID はテナント名のハッシュとして計算されますが、他のスキームも使用できます。 スタンドアロン アプリケーションは接続を管理するためにカタログを必要としません。カタログは、他の操作の範囲をテナント データベースのセットに設定するために使用できます。 たとえば、エラスティック クエリでは、カタログを使用して、テナント間レポートのためにクエリが分散されるデータベースのセットを決定できます。

Elastic Database クライアント ライブラリ

Wingtip サンプル アプリケーションでは、カタログは、Elastic Database クライアント ライブラリ (EDCL) のシャード管理機能によって実装されます。 このライブラリにより、アプリケーションはデータベースに格納される "シャード マップ" を作成、管理、使用できます。 Wingtip Tickets サンプルでは、カタログは、"テナント カタログ" データベースに格納されます。 シャードは、テナントのデータが格納されるシャード (データベース) にテナント キーをマップします。 EDCL 関数は、"テナント カタログ" データベース内のテーブルに格納される "グローバル シャード マップ" と、各シャードに格納される "ローカル シャード マップ" を管理します。

アプリケーションまたは PowerShell スクリプトから EDCL 関数を呼び出して、シャード マップのエントリを作成して管理できます。 その他の EDCL 関数を使用して、シャード セットを取得したり、特定のテナント キーの適切なデータベースに接続したりできます。

重要

カタログ データベース内のデータまたはテナント データベース内のローカル シャード マップは直接編集しないでください。 データ破損のリスクが高いため、直接更新はサポートされません。 代わりに、EDCL API のみを使用してマッピング データを編集してください。

テナントのプロビジョニング

各テナントには、新しい Azure リソース グループが必要です。それは、その中にリソースをプロビジョニングする前に作成する必要があります。 リソース グループを作成したら、Azure Resource Management テンプレートを使用してアプリケーション コンポーネントとデータベースをデプロイし、データベース接続を構成できます。 データベース スキーマを初期化するために、テンプレートは bacpac ファイルをインポートできます。 または、テンプレート データベースのコピーとしてデータベースを作成できます。 その後、データベースを初期会場データで更新し、カタログに登録します。

チュートリアル

このチュートリアルで学習する内容は次のとおりです。

  • カタログをプロビジョニングする
  • カタログにデプロイ済みのサンプル テナント データベースを登録する
  • 追加のテナントをプロビジョニングし、カタログに登録する

Azure Resource Manager テンプレートを使用して、アプリケーションをデプロイして構成し、テナント データベースを作成した後、bacpac ファイルをインポートして初期化できます。 インポート要求は、処理される前に、数分間キューに置かれる可能性があります。

このチュートリアルが終わると、スタンドアロン テナント アプリケーションのセットが作成され、各データベースがカタログに登録されます。

前提条件

このチュートリアルを完了するには、次の前提条件を満たしておく必要があります。

カタログをプロビジョニングする

このタスクでは、すべてのテナント データベースを登録するために使用するカタログをプロビジョニングする方法を学習します。 次の処理を行います。

  • Azure Resource Management テンプレートを使用してカタログ データベースをプロビジョニングする。 データベースは、bacpac ファイルをインポートすることで初期化されます。
  • デプロイ済みのサンプル テナント データベースを登録する。 各テナントは、テナント名のハッシュから構築されたキーを使用して登録されます。 テナント名も、カタログ内の拡張テーブルに格納されます。
  1. PowerShell ISE で、...\Learning Modules\UserConfig.psm を開き、<ユーザー> 値を、3 つのサンプル アプリケーションのデプロイ時に使用した値に更新します。 ファイルを保存します。

  2. PowerShell ISE で、...\Learning Modules\ProvisionTenants\Demo-ProvisionAndCatalog.ps1 を開き、$Scenario = 1 を設定します。 テナント カタログをデプロイし、定義済みのテナントを登録します。

  3. ブレークポイントを追加します。追加するには、& $PSScriptRoot\New-Catalog.ps1 と記述されている行のどこかにカーソルを置いて、F9 キーを押します。

    setting a breakpoint for tracing

  4. F5 キーを押してスクリプトを実行します。

  5. ブレークポイントでスクリプトの実行が停止したら、F11 キーを押して New-Catalog.ps1 スクリプトにステップ インします。

  6. 呼び出された関数にステップ オーバーしたりステップ インしたりする F10 キーや F11 キーなどのデバッグのメニュー オプションを使用して、スクリプトの実行をトレースします。

スクリプトが完了すると、カタログが作成され、サンプルのすべてのテナントが登録されます。

ここで、作成したリソースを見てみましょう。

  1. Azure Portal を開き、リソース グループを参照します。 wingtip-sa-catalog-<ユーザー> リソース グループを開き、カタログ サーバーとデータベースに注目します。

  2. ポータルでデータベースを開き、左側のメニューからデータ エクスプローラーを選択します。 ログイン コマンドをクリックし、パスワードに「P@ssword1」を入力します。

  3. tenantcatalog データベースのスキーマを調べます。

    • __ShardManagement スキーマ内のオブジェクトは、すべてが Elastic Database クライアント ライブラリによってプロビジョニングされます。
    • Tenants テーブルと TenantsExtended ビューは、サンプルに追加された拡張機能であり、これらはカタログを拡張して追加の値を提供する方法を示します。
  4. クエリ SELECT * FROM dbo.TenantsExtended を実行します。

    data explorer

    データ エクスプローラーを使用する代わりに、SQL Server Management Studio からデータベースに接続できます。 これを行うには、サーバーの wingtip- に接続します。

    カタログ内のデータは直接編集すべきではないことに注意してください。常にシャード管理 API を使用してください。

新しいアプリケーションをプロビジョニングする

このタスクでは、1 つのテナント アプリケーションをプロビジョニングする方法を学習します。 次の処理を行います。

  • テナント用の新しいリソース グループを作成します
  • Azure Resource Management テンプレートを使用して、新しいリソース グループ内にアプリケーションとデータベースをプロビジョニングします。 この操作には、bacpac ファイルをインポートして、共通のスキーマと参照データでデータベースを初期化することが含まれます。
  • データベースを基本的なテナント情報で初期化します。 この操作には、会場の種類の指定が含まれます。それにより、イベント Web サイトの背景として使用される写真が決まります。
  • データベースをカタログ データベースに登録します
  1. PowerShell ISE で、...\Learning Modules\ProvisionTenants\Demo-ProvisionAndCatalog.ps1 を開き、$Scenario = 2 を設定します。 テナント カタログをデプロイし、定義済みのテナントを登録します。

  2. スクリプトにブレークポイントを追加します。追加するには、& $PSScriptRoot\New-TenantApp.ps1 と記述されている行 49 のどこかにカーソルを置いて、F9 キーを押します。

  3. F5 キーを押してスクリプトを実行します。

  4. ブレークポイントでスクリプトの実行が停止したら、F11 キーを押して New-Catalog.ps1 スクリプトにステップ インします。

  5. 呼び出された関数にステップ オーバーしたりステップ インしたりする F10 キーや F11 キーなどのデバッグのメニュー オプションを使用して、スクリプトの実行をトレースします。

テナントがプロビジョニングされると、新しいテナントのイベント Web サイトが開きます。

red maple racing

Azure Portal で作成された新しいリソースを検査できます。

red maple racing resources

課金を停止するためにリソース グループを削除する

サンプルの調査が終わったら、作成したすべてのリソース グループを削除して、関連付けられている課金を停止します。

その他のリソース

次のステップ

このチュートリアルで学習した内容は次のとおりです。

  • Wingtip Tickets SaaS スタンドアロン アプリケーションをデプロイする方法。
  • アプリを構成するサーバーおよびデータベースについて。
  • サンプル リソースを削除して、関連する課金を停止する方法。

Wingtip Tickets SaaS アプリケーションのテナントごとのデータベース バージョンを使用して、さまざまなテナント間シナリオをサポートするためにカタログを使用する方法を調べることができます。