[Heroku]別のHerokuアプリのDBに接続する

Other

AというHerokuアプリからBというHerokuアプリのDBに接続する方法を残す

結論

Aの環境変数DATABASE_URLに、BのDBのURLを設定する。

設定方法

2つのHerokuアプリを作成する。

  1. DBだけのアプリ(DBアプリ)
  2. Railsアプリだけのアプリ(APアプリ)

DBアプリにAdd-onでHeroku Postgresを追加する。(デプロイしない)

APアプリにRailsをデプロイする。
デプロイすると、PostgresのAdd-onが追加されて、Config VarsにDATABASE_URLが追加される。

DATABASE_URLはAdd-onと結びついていると変更や削除ができない

APアプリのHeroku Postgresを削除する。
Resources > Add-ons > Heroku Postgresの行の一番右をクリック > Delete Add-on

APアプリのDATABASE_URLを設定する
DBアプリ > Settings > Config Vars > Reveal Config Vars > DATABASE_URLをコピーして、APアプリのConfig VarsにDATABASE_URLを追加し貼り付ける。

$ rails db:migrate をするとDBアプリのdbのテーブル数が増えていることを確認できる。

この方法でDATABASE_URLを設定すると、Add-onに紐づいてない状態になるので、DATABASE_URLの変更や削除ができるので、要注意

気づいた仕様

Resources > Add-on > Heroku Postgres の attachments から接続先のアプリを指定できる。
Manage Attachmentsをクリックすると、画面の右側からボックスが表示されるので、アプリ名で検索してクリックすると、APアプリとDBを紐づけることができる。


紐付けした瞬間に接続先のアプリの環境変数にURLが追加される
接続先のアプリにすでにDATABASE_URLが設定されている場合は、別の名前(HEROKU_POSTGRESQL_WHITEなど)で保存される。ただ、その状態では、Railsアプリ側で特別な設定をしない限り利用できない。その場合は、上述の設定方法にあるやり方で進めていき、DATABASE_URLの設定だけこちらの方法でやれば良い。

attachmentsを使った方法だと、DATABASE_URLがAdd-onと紐づいた状態になるため、Config Varsで変更したり削除できないから安全。

感想

いつ使うのか?と聞かれたら2つのアプリケーションでDBを共有するときとなると思う。

プランをアップグレードすると1Dynoで扱えるプロセス数が増えるので、2つのアプリケーションになっても不要かもしれない。こちらは試したことがないので、仮説。

もし上記の仮説が正しいとするなら、Free Dynoはプロセスが2つまでなので、FreeDynoで役に立つかもしれない。

ただFreeDynoは30分接続しないと自動でスリープするので、総合的に見ると実用的ではないかもしれない。まぁ30分に一回接続するようにバッチとか作れば回避できるので、なんとも言えないっちゃ言えないが。

コメント