DEVELOPER’s BLOG
技術ブログ
Ruby on Rails:マルチテナント環境でのマイグレーションについて
はじめまして、アクセルユニバース システム部の今村と申します。
弊社では業務システムからスマートフォンアプリまで、所謂「なんでも」開発します。
Webアプリケーションも作成します。
直近では、 Ruby On Rails (以下、Railsと記載します) を用いた開発を多く実施してきました。
今回は、弊社で経験した マルチテナント環境でのRailsアプリケーション におけるちょっとしたTipsを紹介いたします。
1. マルチテナントとは
http://e-words.jp/w/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%86%E3%83%8A%E3%83%B3%E3%83%88.html
上記のページに説明されている通りです。
同じWebアプリケーションを複数のアカウントで共有します。
弊社の開発において、Railsを用いたマルチテナント環境の場合は、1つのデータベース(PostgreSQLを利用)内にアカウント単位のスキーマを用意しています。
スキーマを分けることで、各アカウント単位のデータが混在する状態を防いでいます。
どのスキーマのアカウントからのアクセスなのかを判別するのには、サブドメインを用いています。
あるサービスのURLが「https://foobar.com/」であり、アカウントが「imamura」である場合、「imamura」用のURLは「https://imamura.foobar.com/」となるように設計しています。
ちなみに、これらの仕掛けはゼロから構築したのではなく、Apartmentというgemを使用しています。
http://qiita.com/kakipo/items/a584d24771dff019d3a9
2. rake db:migrate
Railsを用いたアプリ開発ではよく使うコマンドだと思います。
Railsにおけるマイグレーションの実行コマンドですね。
2-1. マイグレーションとは
念のため、マイグレーションについて簡単に説明しておきます。
Railsでは、データベースの操作(テーブルの追加、カラムの更新・変更・削除等)を、 マイグレーション と呼ばれる機能を使って行います。
通常、データベースの操作はSQLを実行すると思います。
これをマイグレーションで実施する場合は、マイグレーションスクリプトと呼ばれるスクリプトファイルを作成して、コマンドを実行するだけで済みます。
このコマンドが、上述の rake db:migrate になります。
参考:
http://railsdoc.com/references/rake%20db:migrate
2-2. マイグレーションの実行について
本記事では、 マルチテナント環境における マイグレーションと題しています。
この環境でマイグレーションを行った時、困ったことがありました。それは
rake db:migrate コマンドは、publicスキーマにしか実行されないということです。
前述の通り、マルチテナント環境は、同じテーブル構成を持つ複数スキーマを、それぞれのサブドメイン環境で使い分けて実現しています。
つまり、何かしらのデータベース定義の変更が必要となった場合、 追加したマイグレーションスクリプトの内容を、全てのスキーマに 適用させる必要が有ります。
3. マルチテナント環境でのdb:migrate
弊社で初めてRailsでのマルチテナントアプリを構築した場合、上述の問題については、意外と情報が見つけられず、困りました。
ですが、(本当にちょっとしたコトですが、)以下のオプションをコマンドに付け加えることで、publicスキーマ以外のスキーマにも、マイグレーションスクリプトの内容を反映できました。
$ DB=foo rake db:migrate
これだけです。DB=スキーマ名。
もちろん、db:migrate実行時の他のオプション(RAILS_ENV や up down など)も実行できます。
あまり大した内容ではありませんでしたが、マルチテナント環境に限らず、public以外の別スキーマにマイグレーションしたい!という方の参考になればと思います。
今後
DB=スキーマ名 オプションで、各スキーマへのマイグレーション実行できるのは良いのですが、アプリの更新時に、全スキーマの数だけコマンド実行するのが大変面倒です。
一括で実行できるスクリプトでも作って対応しようと思います。