Ruby データベースのプロビジョニング
最終更新日 2017年11月15日(水)
Table of Contents
buildpack リリース API の現在の動作方式が原因で、(Ruby buildpack によって実装される) Heroku の Ruby サポートでは、初回のデプロイ時にしかアドオンをアプリケーションに追加できません。
デフォルトでは、pg
gem 依存関係を持つすべての Ruby アプリには、最下位の無料 Heroku Postgres プランが初回デプロイ時に追加されます。
Rails アプリケーションには pg
ではなく sqlite3
がデフォルトでバンドルされ、アドオンは最初のプッシュ時に自動で追加することしかできないため、多くの開発者は、コードをデプロイし、正しくないデータベースドライバーを使用していることを認識した後に Gemfile を更新していました。
誤ってこのプロセスで pg
gem なしでデプロイが成功した場合、この buildpack は、後続のデプロイで Heroku Postgres を自動的にプロビジョニングできなくなります。
Heroku 上の以前のスタックとの下位互換性のために、Rails (より具体的には railties
gem) を使用してデプロイされるすべてのアプリはデフォルトでデータベースを得るという決定が下されました。これにより、pg
を Gemfile に入れる前にデプロイしたが後からそれを追加するという状況が回避されます。
Rails での別のデータベースの使用
Heroku Postgres 以外のデータベースを使用している場合、Rails アプリ用に Postgres データベースをプロビジョニングするデフォルトの動作は、既存の設定と矛盾する可能性があります。Rails の各バージョンとデータベースの正しい接続についての詳細は、「Rails データベース接続の動作」を参照してください。
Heroku 上の Rails のすべてのバージョンで、DATABASE_URL
環境変数の情報がデフォルトで優先されます。これは、Postgresql データベースを使用していない場合に問題となります。なぜなら、Heroku によってデータベースがアプリケーションに追加された後、環境変数がまだ設定されていない場合、このデータベースが DATABASE_URL
に “プロモート” するからです。このとき、アプリケーションは誤って Postgresql データベースに接続しようとします。
このケースへの対処戦略は 2 つあります。DATABASE_URL
環境設定を設定するか、削除するかです。
DATABASE_URL
環境設定の設定
アプリで DATABASE_URL
環境設定を設定できます。 これにより、Heroku が Postgres データベースアドオンを “プロモート” するのを防ぎます。
$ heroku config:set DATABASE_URL=<scheme>://<username>:<password>@<host>
ここでは、上記の値を、実際に使用するデータベースの資格情報とアドレスに置き換えます。
パイプラインまたはレビューアプリを使用している場合、各レビューアプリをデプロイする前に heroku config:set
は実行できないため、この戦略は機能しません。
これに対処するために、コード内で DATABASE_URL
の値を動的に割り当てることができます。これはデータベースが初期化される前に行う必要があります。 次に例を示します。
ENV["DATABASE_URL"] = "mysql://#{ ENV['MY_DATABASE_PASSWORD'] }:#{ ENV['MY_DATABASE_USERNAME'] }@#{ ENV['MY_DATABASE_HOST'] }"
これは、イニシャライザに配置することも、config/database.yml
で ERB コードセクションの内側に直接配置することもできます。重要なのは、アプリケーションがデータベースに接続しようとする前にこのコードが実行されることです。
DATABASE_URL
環境設定の削除
もう 1 つの方法として、本番データベースの資格情報が config/database.yml
にある場合、接続が初期化される前に DATABASE_URL
を削除することによって、アプリでデータベースへの接続にこの情報が使用されることを確実に回避できます。
ENV.delete("DATABASE_URL")