railsの本番サイトのデータベースを別サーバーで行うための方法

今回やりたいことです。

  • app/dbサーバーを分けて運用する

そんなの当たり前だろ!って感じですが、デプロイするときに詰まったので、忘れないために書いておきます。

なお、今回のお話はmysqlでの運用にしておりますが、他のデータベースでも同じ感じでいけると思います。

mysqlでリモートの接続を許可する

こんな設定あるとは知りませんでした。

言われてみれば、どこからでもデフォルトでアクセスできるのは、危険としか言いようがありません。

/etc/mysql/mysql.conf.d/mysqld.cnfファイルから、mysqlの設定を変更します。

# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
log-error       = /var/log/mysql/error.log
# By default we only accept connections from localhost
# bind-address  = 127.0.0.1
bind-address    = xxx ←ここをmysqlがあるサーバーのIPアドレスにする
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

これでmysql -h IPアドレス -u hoge -pでアクセスできるようになります。

補足

ただし、この場合は全世界に解放されている状態なので、最低でもDBサーバーにアクセスする場所からしか入れないようにしましょう。

AWSの場合はセキュリティグループがあるので、port:3306へのアクセスはIPアドレスで制限しましょう。

ファイアーウォールでもそういう設定はできるでしょう。

database.ymlの設定

production:
  <<: *default
  host: xxx ←IPアドレスを環境変数で設定しておきましょう
  ...

mysql userの作成

deployするとmysqlのユーザーはhoge@localhostではなく、hoge@IPアドレスでアクセスします。

なので、それに沿ってユーザーを作成しましょう。

  • ユーザー作成
  • 権限設定
create user {user名}@IPアドレス identified by {パスワード} -- ユーザー作成

grant all on foo_db.* to {user名}@IPアドレス identified by {パスワード};

この辺を注意して作成します。

以上です。

やってる内容は普通なのですが、意外に詰まってしまった。