マルチテナントとは
一つのアプリケーションインスタンスを複数のユーザーや組織(テナント)が共有することを指します。各テナントは独自のデータセットを持ち、他のテナントのデータにアクセスすることはできません。
マルチテナントの実装方法
モデルベース
-
特徴: 同じデータベースを使用し、テナントごとにデータを区別するための外部キー(例: company_id)を持つ。
-
実装例:
テナントモデル(例: Company)の作成。
各テナントごとのデータを区別するための外部キーの追加。
現在のテナントの設定(例: サブドメインを使用)。
-
実装例:
-
サブドメインベース
特徴: 各テナントが独自のサブドメインを持つ。- 実装例:
DNSでワイルドカードサブドメインの設定。
Railsのルーティングでサブドメインを制約として使用。
サブドメインのバリデーションの追加。
- 実装例:
サブドメインベースのマルチテナント
ここではサブドメインベースのマルチテナント実装手順例を書きます。
1. DNSの設定
ワイルドカードサブドメインを設定します。これは、ドメイン提供者の設定画面で行います。
2. サブドメインの制約を使用したルーティングの設定
config/routes.rb
にサブドメインの制約を追加します。
constraints(Subdomain) do
resources :dashboard, only: [:index]
end
3.サブドメインのバリデーションの追加
Companyモデルにサブドメインのバリデーションを追加します。
class Company < ApplicationRecord
validates :subdomain, presence: true, uniqueness: true
end
4.サブドメインの制御
以下のようなSubdomainクラスを作成して、特定のサブドメイン(例: wwwやadmin)を除外する制約を設定します。
class Subdomain
def self.matches?(request)
return unless request.subdomain.present? && request.subdomain != 'www'
request.subdomain.split('.').first != 'admin'
end
end
このクラスを使用すると、www.yourdomain.comやadmin.yourdomain.comのようなサブドメインでのアクセスを特定のルーティングから除外することができます。
ワイルドカードサブドメインとは、
DNS設定において、あらゆるサブドメインのリクエストを一つのIPアドレスやホストにマッピングするための特殊な設定です。具体的には、*(アスタリスク)を使用してサブドメインを表現します。
例えば、*.example.comというワイルドカードサブドメインを設定すると、user1.example.com、user2.example.com、anything.example.comなど、example.comの任意のサブドメインが同じIPアドレスやホストに解決されます。
ワイルドカードサブドメインの利点:
1.柔軟性:
新しいサブドメインを追加するたびにDNSを更新する必要がなく、動的にサブドメインを生成・使用することができます。
マルチテナントアプリケーション: ユーザーや組織ごとに独自のサブドメインを提供するマルチテナントアプリケーションの実装に役立ちます。
2.簡単な管理:
一つのワイルドカードエントリで多数のサブドメインをカバーできるため、DNSの管理が簡単になります。
3.注意点:
セキュリティの観点から、ワイルドカードサブドメインを使用する際は、不正なサブドメインのリクエストを適切に処理する必要があります。
SSL/TLS証明書を使用する場合、ワイルドカード証明書が必要になることがあります。
ワイルドカードサブドメインは、特定のニーズに合わせて適切に使用することが重要です。
Railsプロジェクトでワイルドカードサブドメインを実装する際の具体的な手順を以下に示します。
1. DNS設定
まず、ドメインのDNS設定でワイルドカードサブドメインを設定します。これは、ドメインを管理しているプロバイダの設定画面で行います。
例:
*.yourdomain.com A 123.45.67.89
2. Railsのルーティング設定
config/routes.rbでサブドメインを制約として使用します。
constraints subdomain: /^(?!www)(\w+)/ do
# ここにサブドメインでアクセスした際のルーティングを記述
end
3. サブドメインの取得と利用
ApplicationControllerでサブドメインを取得し、それを利用してテナント(またはユーザー、組織など)を特定します。
class ApplicationController < ActionController::Base
before_action :set_tenant
private
def set_tenant
subdomain = request.subdomain
@tenant = Tenant.find_by(subdomain: subdomain)
# もしテナントが見つからない場合の処理も追加すると良いでしょう。
end
end
4. モデルの設定
Tenantモデル(またはUser、Companyなどのモデル)にサブドメインのカラムとバリデーションを追加します。
class Tenant < ApplicationRecord
validates :subdomain, presence: true, uniqueness: true
end
5. SSL/TLS証明書
ワイルドカードサブドメインを使用する場合、ワイルドカードSSL/TLS証明書を取得して、全てのサブドメインでHTTPSを使用することをおすすめします。