DesignAssembler

備忘録に近い

サブドメインでアクセスした時にデータベースを切り替える(rails)

ステージングをサブドメインに設定して(staging.*****.jp)そのアドレスの時接続データベースを切り替える方法です。

環境

・EC2(CentOS)
・RDS(MySQL)
ムームードメイン

前提
ムームードメインドメイン取得済み
route53でドメイン設定済み


流れ

ムームードメインサブドメインの設定
・route53でDNSの設定
mysqlに新しいdbを作成
railsサブドメインごとに振り分け


ムームードメインサブドメインの設定

まずムームードメイン(https://muumuu-domain.com/?mode=conpane)にログインします。


ムームーDNSをクリックすると以下の画面になります。

f:id:hyottokoaloha:20150825111950p:plain


"処理"の"変更"をクリックしてください。以下の画面に飛びます。

f:id:hyottokoaloha:20150825234107p:plain

ここでサブドメインの設定をします。

>サブドメイン:設定したいサブドメイン名を入力します
>種別:ここではAとします
>内容:サーバーのIPアドレスを入力します

セットアップ情報変更ボタンを押していただければムームードメイン側の設定は完了です。

route53の設定

route53(https://console.aws.amazon.com/route53/home)に入ります。

ドメイン名をクリックして設定してあるドメインに入ります。

f:id:hyottokoaloha:20150825123942p:plain


"CreateRecordSet"から新しくレコードを作成します。


f:id:hyottokoaloha:20150825140027p:plain

>Name:ワイルドカード(*)を指定
>Alias:Yesにチェック
>Alias Target:自分のドメインを選択

"Create"ボタンを押せば設定完了です。

以上でサブドメインの適用が終わりました。いったん適用されているかをアクセスして確認してみてください。

MySQLサブドメイン用のデータベースを作成

MySQLに直接入ってデータベースを作ります。以下のコマンドでMySQLに入ってください。

$ sudo mysql -h <dbのアドレス> -P 3306 -u <ユーザーネーム> -p <dbの名前>

入ったらデータベースを作成します。

mysql> create database staging_db;

以下のコマンドでちゃんと追加されているか確認してください。

mysql> show databases;

これで作成完了です。

railsサブドメインごとに振り分け

rails内のファイルを修正してサブドメインによって使用するデータベースを振り分けていきます。

サブドメイン用データベースの作成

まず、database.ymlを編集します。

#config/database.yml
default: ...
develop: ...
test: ...
production: ...

#以下を追加
staging_db:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: staging_db
  pool: 5
  username: <ユーザーネーム>
  password: <パスワード>
  socket: /var/lib/mysql/mysql.sock
  host: <ホストアドレス>
  port: 3306

次に、マイグレーションを通すために環境ファイルを追加します。

config/environments/production.rbをコピーしてconfig/environments/staging_db.rbとします。

$ cp config/environments/production.rb config/environments/staging_db.rb

これでマイグレーションが通ります。

$ rake db:migrate RAILS_ENV=staging_db

サブドメインによる振り分け

振り分けにはrequestを使います。

request - リファレンス - - Railsドキュメント

request.subdomainを呼び出すと、アクセスした時そのサブドメインを取得することができます。

app/controllers/application.rbに以下を追加してください。

#app/controllers/application.rb
before_action :request_dist

protected
  def request_dist
    if request.subdomain=="staging"
        User.establish_connection :staging_db
        Address.establish_connection :staging_db
    else
        User.establish_connection :production
        Address.establish_connection :production
    end
  end

サブドメインがstagingの時のみUserモデルとAddressモデルは別のデータベースに接続するように設定しました。

これでサブドメインでアクセスした時に接続dbを切り替えることができました。


参考

以下のページを参考にさせてもらいました。ありがとうございます。

www.techscore.com

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails