DEVELOPER’s BLOG

技術ブログ

Ruby on Rails:マルチテナント環境でのマイグレーションについて

2016.12.28 今村 幸平
アプリ開発
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_ENVup down など)も実行できます。


あまり大した内容ではありませんでしたが、マルチテナント環境に限らず、public以外の別スキーマにマイグレーションしたい!という方の参考になればと思います。

今後

DB=スキーマ名 オプションで、各スキーマへのマイグレーション実行できるのは良いのですが、アプリの更新時に、全スキーマの数だけコマンド実行するのが大変面倒です。

一括で実行できるスクリプトでも作って対応しようと思います。

関連記事

Core MLとVision、Inception v3モデルを使ってOSアプリを作成する

はじめに iOSネイティブアプリと機械学習を組み合わせたいと思い、Appleが提供してくれているフレームワークCore MLとVision、事前に訓練したInception v3モデルを使用し、ドラマのSilicon Valleyに出たthis is not hot dogアプリを作ってみました。  this is not hot dog とは、撮影された画像がホットドッグかどうかを認識するアプリです。YouTube動画がありますのでご覧ください。YouT

記事詳細
Core MLとVision、Inception v3モデルを使ってOSアプリを作成する
アプリ開発 画像認識
HoloLensの開発環境構築とサンプルアプリの作成

はじめまして。アクセルユニバース株式会社でインターンをしている中村と申します。 これまでこの会社でAndroidアプリ開発、RubyやPHPを使ったWeb開発などに携わってきました。MicrosoftからHoloLensが日本で発売されたので、弊社でも早速購入し、アプリケーションを作っております。 そこで、この記事ではMicrosoft HoloLensの開発環境を作り、簡単なアプリを作成したことを報告します。今回は、実機を用いて開発するため、エミュレータ

記事詳細
HoloLensの開発環境構築とサンプルアプリの作成
アプリ開発
開発における「テスト」の大切さ

前の更新から時間が経ってしまいましたが、 今回は、「テスト」について書きたいと思います。 「テスト」って聞くと、すごい嫌なイメージをされる方も多いと思います。 しかし、システム開発で行うテストはただのテストではなく『バグ探し』と呼ばれています。 システム開発で実施するテストは ①単体テスト ②結合テスト ③総合テスト と様々なテストがあります。 テストは、品質を担保するために行います。 いざ使ったら、バグだらけなんて嫌ですもんね。 ここで、各テストがどうい

記事詳細
開発における「テスト」の大切さ
アプリ開発

お問い合わせはこちらから