🦈

heroku + Ruby on Rails + MySQL なら JawsDB が便利な事を知っておこう

4 min read

heroku + Ruby on Rails でも MySQL を使いたい

heroku は便利ですが
無料プランにこだわらないのであれば RDB には MySQL を使いたいですよね(偏見)

heroku で MySQL を扱う Add-on には現在 ClearDB と JawsDB があります。
が、ClearDB は MySQL 5.6 が default で MySQL 5.7 もサポートはしている、
という状態です。

MySQL 8.0 も 2018年4月リリースですから、リリースされて 3年で十分に知見も溜まってきています。
文字コードの問題などで今更 MySQL 5.x なんて使いたくない……
そんな人は、実質 JawsDB 一択となります。

似たような話をしている記事もありますね

というわけで JawsDB を使っていきましょう。

JawsDB のこと

このあたりに目を通せば大体わかります。

使い始めるとわかるんですが(少なくとも Shared ではない Whitetip プラン以上は)ただのAmazonRDSです。

各プランの詳細も上記ページに書いてありますが、チェックしておきたいことは1つで
Shared プラン(Multi-tenant) と Single-tenantプランがあるということです。

例えば、Shared プラン→ Single-tenantプラン へのアップグレードは
以下のように手動でバックアップ&復元を行う必要があったりするので抑えておきたいところです。
(Shared プラン間のプラン変更は自動作業で行えます)

heroku Webページ上から JawsDB Add-on を追加する

アドオンの追は heroku の Webページ上から簡単にできます。
Resources タブの Add-ons から検索して選択するだけです。

選択したらダイアログが開くので、planを選択して Submit Order Form です。

Add-on を追加すると、
JawsDB ダッシュボードへのリンクが表示されるようになります。

config/database.yml にを設定

heroku は RAILS_ENV=production で動作するので config/database.yml の production のところをこんな感じに編集します。
<%= ENV['HOGE'] %> の部分は heroku の環境変数、
つまり heroku config の値と対応させるのでどんなキー名でもかまいません。

config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
...
production:
  <<: *default
  database: <%= ENV['MYSQL_DATABASE'] %>
  url: <%= ENV['MYSQL_URL'] %>
  username: <%= ENV['MYSQL_USERNAME'] %>
  password: <%= ENV['MYSQL_PASSWORD'] %>
  host: <%= ENV['MYSQL_HOST'] %>

default の方に、production で上書きしてない development 用の設定などが残っていると
うまく動かなかったりするので注意してください。

JawsDB のダッシュボードから heroku の環境変数を登録する

先ほど heroku のWebページから JawsDB Add-on を追加しましたが、
同じく heroku Web ページの Resources タブに
追加した Add-on である JawsDB が表示されていると思います。
その表示がリンクになっていて、そこから JawsDB のダッシュボードを開くことができます。

開いたダッシュボードには 追加した JawsDB の

  • database
  • url
  • host
  • username
  • password

が表示されているので、
先ほど config/database.yml に記載した <%= ENV['HOGE'] %> のキー値で
heroku の環境変数、つまり heroku config に登録していきます。

# heroku のリモートリポジトリを設定したローカルリポジトリのディレクトリ配下で実行
$ heroku config:set MYSQL_DATABASE=XXXXXXXXX
$ heroku config:set MYSQL_URL=XXXXXXXXX
$ heroku config:set MYSQL_USERNAME=XXXXXXXXX
$ heroku config:set MYSQL_PASSWORD=XXXXXXXXX
$ heroku config:set MYSQL_HOST=XXXXXXXXX

こんな感じですね。
注意点としては、以下にも記載があるように
今回の config/database.yml 例のように adapter として mysql2 を使用している場合は
url の値を mysql2:// から初めてやるように読み替える必要があります。

環境変数の設定が終わったら、heroku に push しましょう。
設定に問題がなければ、 rails db:migrate が通るはずです。

$ git push heroku main
$ heroku run rails db:migrate

簡単便利ですね!

このあたりの記事も参考にしました。

今回はここまでです。じゃ!

Discussion

ログインするとコメントできます