Skip to main content

 

 

 

 
Language:

 

 
 
 
OutSystems

マルチテナント型アプリケーションを開発する方法

この記事の適用対象:

OutSystems 7.0以降

マルチテナントを使用すると、最新のエンタープライズアプリケーションやサービスとしてのソフトウェア(SaaS)を複数のユーザーに提供する際のニーズに対応しながら、データ、構成、エンドユーザーを効果的に分離することができます。

この方法を採用することにより、1つのアプリケーションサーバーとデータベースサーバーを使用して、ユーザーそれぞれに固有の独立したコンピュータリソースを提供できます。

ユーザーからは独立したアプリケーションがあるように見えますが、実際はユーザーごとにある程度のカスタマイズが可能な単一のアプリケーションです。

上記の例は、マルチテナントによって2つのクライアント組織(テナント)にサービスを提供する単一のアプリケーションを示しています。各クライアントは、それぞれの取引先と案件を各テナント内に分離して保有しています。

マルチテナントを使用するメリット

マルチテナント型アーキテクチャを使用したアプリケーションの設計には、以下のメリットがあります。

  • サーバーにデプロイするアプリケーションが1つのみであるため、インフラの運用コストを削減できる。

  • データ、エンドユーザー、セッション、プロセスに対して厳格なセキュリティポリシーを適用できる。

  • 保守が必要なコードベースが1つであるため、アプリケーションの開発や保守の作業を簡素化できる。

OutSystemsプラットフォームのマルチテナント

エンドユーザーが初めてマルチテナント型アプリケーションへのリクエストを行うときは、匿名になるため、エンドユーザーが属するテナントを推定できず、エンドユーザーはデフォルトテナントに紐付けられます。

デフォルトテナントにはデータがないため、エンドユーザーが連絡先一覧画面にアクセスしても連絡先は表示されません。

エンドユーザーは固有のテナントに属するため、ログインプロセス中に、OutSystemsプラットフォームによってエンドユーザーが属するテナントがユーザー名を使用して推定されます。ログイン後、エンドユーザーは所属のテナントに紐付けられます。単純なクエリや複雑なクエリは自動的にフィルタリングされ、属するテナントのデータのみが返されます。

: エンドユーザーはOffice inc.のユーザーとして識別されるとそのテナントに制限され、連絡先一覧画面にAbel Pasquale、Adam Dimaggio、Alan Pryorなどが表示されます。このエンドユーザーがBricks’r’usテナントの連絡先の情報を参照することはできません。

テナントに固有の要素

このセクションでは、eSpace、エンティティ、サイトプロパティ、タイマーを設定してマルチテナント型アプリケーションを作成する方法について説明します。

OutSystemsプラットフォームによって自動的にデータの分離が行われるため、エンティティ、サイトプロパティ、タイマーのうち、クライアント間で分離するものと共有するものを指定するのみです。OutSystemsプラットフォームはユーザーのセッションが紐付けられたテナントのデータのみを取得するため、クエリやその他のビジネスロジックを変更する必要はありません。

eSpaceの設定

マルチテナント型アプリケーションを作成する場合は、アプリケーションの各eSpaceにマルチテナント型であることを明示する必要があります。これを行うには、eSpaceの「Is Multi-tenant」プロパティを「Yes」に設定します。この設定を行うと以下のようになります。

  • データ、エンドユーザー、セッション、プロセスがテナントごとに分離されます。

  • eSpaceがマルチテナント対応であることが他の開発者に通知されます。

エンティティの設定

アプリケーションの各eSpaceのエンティティを確認し、それぞれがシングルテナント型(データがすべてのテナントの間で共有される)か、マルチテナント型(データがテナントごとに分離される)かを決定します。

eSpaceをマルチテナントに設定した後、エンティティ、サイトプロパティ、タイマーの「Is Multi-tenant」プロパティが適切に設定されていることを確認する必要があります。

エンティティがシングルテナントであればデータはすべてのテナントで共有され、マルチテナントであればデータはテナントに固有になります。

例: あるオンラインショップアプリケーションでは、テナントごとに独自のクライアント、製品、請求書があるため、Client、Product、Invoiceのようなエンティティのデータはテナントごとに分離されます。

一方、為替レートや国はすべてのテナントで同じであるため、CurrencyExChangeRateやCountryのようなエンティティのデータはすべてのテナントで共有されています。

エンティティの動作を決定した後、「Is Multi-tenant」プロパティを以下のいずれかの値に設定します。

  • 「Yes」: eSpaceのIs Multi-tenantプロパティで設定された値にかかわらず、エンティティのデータはテナントごとに分離されます

  • 「No」: eSpaceのIs Multi-tenantプロパティで設定された値にかかわらず、エンティティのデータはテナントごとに分離されません

  • < Not Defined >: エンティティのデータのマルチテナントの動作は、eSpaceのマルチテナントの動作(eSpaceの「Is Multi-tenant」プロパティで設定された値)から継承されます。なお、静的エンティティはすべてのテナント間で共有されます。

なお、静的エンティティはすべてのテナント間で共有されます。

サイトプロパティの設定

エンティティと同様に、サイトプロパティでもデータを分離するかテナント間で共有するかを指定できます。

例: あるオンラインショップアプリケーションでは、クライアント組織が世界各地にある場合があります。このため、テナントごとに独自のデフォルト通貨を設定する必要があり、「Default Currency」サイトプロパティの値がテナントごとに分離されます。

一方、ユーザーがログインプロセスで誤ったパスワードを入力できる回数はすべてのクライアント組織で同じであり、「Number of Retries」サイトプロパティの値はテナント間で共有されます。

サイトプロパティの「Is Multi-tenant」プロパティを以下のいずれかの値に設定します。

  • 「Yes」: サイトプロパティの値はテナントごとに分離されます。

  • 「No」: サイトプロパティのデータはテナントごとに分離されません。

  • < Not defined >: サイトプロパティのマルチテナントの動作は、eSpaceのマルチテナントの動作から継承されます。

タイマーの設定

エンティティやサイトプロパティと同様に、タイマーを特定のテナントのスコープ内で実行する(テナントごとに1回実行し、そのテナントのデータのみを操作する)か、デフォルトテナント内で実行する(テナント間で共有されるデータを操作する)かを指定できます。

例: オンラインショップアプリケーションでは、クライアント組織ごとに独自のクライアントと製品があるため、レポートデータを統合するバッチジョブ(タイマー)はテナント間で分離されます。

しかし、為替レートはすべてのテナントで共有されるため、為替レートを更新するタイマーはすべてのテナント間で共有されます。

タイマーの「Is Multi-tenant」プロパティを以下のいずれかの値に設定します。

  • 「Yes」: タイマーがテナントごとに1回実行されます。タイマーがテナントで実行されるとき、タイマーはそのテナントが保有するデータにのみアクセスできます。

  • 「No」: タイマーが1回実行されます。タイマーはすべてのテナントで共有されるデータを読み取り、操作することができます。

  • < Not defined >: サイトプロパティのマルチテナントの動作は、eSpaceのマルチテナントの動作から継承されます。

テナントごとのセッションの分離

既述のとおり、エンドユーザーは1つのテナントに属します。そのため、アプリケーションのログインプロセスではユーザー名とテナントが一意に一致する必要があります。

デフォルトのUsersアプリケーションを使用してユーザー管理を行い、アプリケーションのログインプロセスを一元化する場合、エンドユーザーはログインプロセスの際に自動的にテナントに紐付けられます。必要なことは、テナント全体でユーザー名が一意となるようにすることのみです。これを実現するには、ユーザー名としてusername@companyを使用します。

カスタムユーザープロバイダ

カスタムユーザープロバイダアプリケーションを使用する場合、エンドユーザーを識別して適切なテナントへの紐付けを行う必要があります。これには、2つの方法があります。

  • User_Login: デフォルトのUsersアプリケーションのUser_Loginアクションは、エンドユーザーを自動的に適切なテナントに紐付けます。ログインが成功するとすべてのクエリが自動的にフィルタリングされ、そのテナントのデータのみが返されます。

  • TenantSwitch: TenantSwitchシステムアクションは、指定されたテナントにコンテキストを変更します。

カスタマイズされたログインで、エンドユーザーがアクセスするテナントを指定します。エンドユーザーがユーザー名、パスワード、テナントを指定すると、ログインしようとしているユーザーを(ユーザー名が同じ2人のエンドユーザーが異なるテナントにいたとしても)一義的に特定できます。

テナントとエンドユーザーの管理

フロントオフィス

エンドユーザーが独自のテナントの登録や管理を行うことができるセルフプロビジョニングのロジックを実装することもできます。

この場合、エンドユーザーがテナント名と管理者の資格情報を指定するフロントオフィスがあります。新しいテナントはすぐに作成されます。

エンドユーザーが新しいテナントを作成すると、そのテナントでのみユーザー管理を行うことができます。他のテナントで作成されたエンドユーザーを管理することはできません。

バックオフィス

テナントを管理するためにシングルテナントのバックオフィスを作成し、そこで新しいテナントを作成することができます。この場合、新しいテナントの作成やエンドユーザーが属するテナントの指定を行うテナントマネージャーがいます。テナントマネージャーは、テナント全体のすべてのエンドユーザーを管理できます。

また、バックオフィスでは管理ユーザー(テナントマネージャー)を作成するためにシングルテナントのeSpaceが必要です。

警告: デフォルトの「Users」アプリケーションを使用してユーザー管理を行う場合、アプリケーションを正しく動作させるために「Users」テナントの名前は変更できません。

マルチテナント型アプリケーションの例

マルチテナント型アプリケーションの作成方法をわかりやすく示すため、この例はOutSystems ForgeのSalesアプリケーション(シングルテナント)に基づいています。

この例では、以下を確認できます。

  • データの分離を実装する方法

  • エンドユーザーが独自のテナントをセルフプロビジョニングし、それらのテナントのエンドユーザーを作成することができるフロントオフィスを実装する方法

  • テナントやテナント全体のエンドユーザーを管理できる一元的なバックオフィスを実装する方法

この例には、以下のコンポーネントが含まれます。

  • TenantManagement eSpace: テナントやテナント全体のエンドユーザーの管理をサポートします。このバックオフィスは、テナント管理者が使用します。

  • BackOfficeUsers eSpace: 管理(IT)ユーザーの管理をサポートします。BackOfficeUsers eSpaceで作成されたエンドユーザーは、TenantManagementアプリケーションにアクセスしてテナントのプロビジョニングと構成を行うことができます。

  • Salesソリューション: エンドユーザーがセルフプロビジョニングと独自のテナントのエンドユーザーの管理を行うことができるマルチテナント型アプリケーション。テナントを作成した後、フロントオフィスのUsersアプリケーションを使用してそのテナントのエンドユーザーを管理します。

  • Users eSpace: エンドユーザーの管理をサポートします。これはマルチテナントであるため、テナントマネージャーはUsers eSpaceにログインすると、独自のテナントのエンドユーザーの管理のみを行うことができます。

Salesアプリケーションの変更

以下のセクションでは、Salesアプリケーションをシングルテナント型からマルチテナント型に変更し、データを分離して複数のクライアント組織で同時に使用できるようにする方法について説明します。

eSpaceの設定

Salesアプリケーションをシングルテナント型からマルチテナント型に変更するため、Salesソリューションの複数のeSpaceを変更してデータの分離を行いました。

  • Sales、Customers、SalesSampleData、SelfRegisterの各eSpaceの「Is Multi-tenant」プロパティを「Yes」に変更しました。

  • CountriesとCustomersSampleDataの「Is Multi-tenant」プロパティは変更していません。

エンティティの構成

エンティティの「Is Multi-tenant」プロパティに値が設定されていない場合、eSpaceの設定がすべて継承されるため、エンティティはマルチテナントに変更されています。

eSpaceの「Is Multi-tenant」プロパティを変更したら、eSpaceのエンティティ、サイトプロパティ、タイマーに適切な値が設定されていることを確認する必要があります。

SalesSampleData eSpaceとSelfRegister eSpaceにはエンティティが含まれないため、Sales eSpaceとCustomers eSpaceのすべてのエンティティでデータの分離が必要かどうかを確認する必要があります。

Sales eSpaceのAccountManager、Opportunity、OpportunityHistory、QuarterQuota、Taskの各エンティティはテナントごとに独立したものであるため、そのままマルチテナントにしておく必要があります。

Customers eSpaceのCompany、CompanyHistory、Contact、ContactHistory、ContactPictureの各エンティティもテナントごとに独立したものであるため、そのままマルチテナントにしておく必要があります。

サイトプロパティの構成

サイトプロパティは、エンティティと同様にeSpaceのIs Multi-tenant値を継承します。

そのため、Sales、SalesSampleData、SelfRegisterの各eSpaceを確認して、サイトプロパティをシングルテナントに変更してテナント間で共有する必要があるかどうかを検証する必要があります。

この例では、いずれのサイトプロパティもテナント間で分離する必要があります。つまり、変更は不要です。

タイマーの構成

この例では、SalesSampleData eSpaceにのみSalesアプリケーションのエンドユーザーを作成するタイマーが含まれています。テナントごとに1回タイマーを実行したいので、変更は不要です。タイマーはeSpaceの「Is Multitenant」プロパティを継承します。

フロントオフィスの実装

SelfRegister eSpaceはテナントのセルフプロビジョニングをフロントオフィスに実装する方法を示しています。エンドユーザーはこれを使用して、テナント名とテナント管理者の資格情報を指定し、独自のテナントをプロビジョニングすることができます。

エンドユーザーは、管理ユーザーのサポートを受けずに、Sales eSpaceのログイン画面にある[Sign up for free]リンクを使用して、Salesアプリケーションのテナントをプロビジョニングすることができます。このとき、エンドユーザーはテナント名とテナント管理者の資格情報を指定する必要があります。

Saveアクションで、フィールドを検証して有効かどうかを確認します。TenantCreateシステムアクションで指定された名前の新しいテナントを作成し、次にTenantSwitchシステムアクションで新しく作成されたテナントにコンテキストを変更します。そして、テナント管理者ユーザーが作成されますが、Usersエンティティはマルチテナントであるため、新しいユーザーはOfficeIncテナントに制限されます。

バックオフィスの実装

テナントとエンドユーザーの管理

ITチームがテナントとすべてのテナントのユーザーの管理を行うことができるバックオフィスを実装する方法を理解するため、TenantManagement eSpaceを確認します。これは、データの分離が行われないシングルテナントのeSpaceです。

エンドユーザーはテナントごとに分離されていますが、TenantManagement eSpaceにテナントとは関係なくすべてのエンドユーザーを一覧表示する画面を実装します。これを実現するには、「Show Tenant Identifier」プロパティを使用します。

TenantManagement eSpaceのGroup、Group_Role、Group_User、User、User_Effective_Role、User_Roleの各エンティティに特に注意します。これらのエンティティは、赤色で表示されています。これは、(エンティティのプロパティの[Advanced]タブにある)「Show Tenant Identifier」にチェックが付いていることを示しており、明示的にテナントの分離の制限が無視されます。

たとえば、Userエンティティの「Show Tenant Identifier」にチェックが付いている場合、エンドユーザーが属するテナントにかかわらず、TenantManagement eSpaceですべてのエンドユーザーデータを操作できます。このプロパティは、この場合のように例外的な状況に限り使用してください。

ITユーザーの管理

最後のBackOfficeUsersは、ITユーザー管理をサポートするシングルテナントのeSpaceです。このバックオフィスで作成されたエンドユーザーは、TenantManagement eSpaceにアクセスできます。

ITマネージャーがBackOfficeUsersにアクセスして、Adam Carlsonのために新しいITユーザーを作成します。その後、AdamがTenantManagementアプリケーションにアクセスして、新しいテナントやそのテナントに紐付けられたエンドユーザーを作成することができるようになります。