Ruby データベースの自動プロビジョニング
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2024年04月24日(水)
Heroku Postgres データベースは、特定の条件が満たされている場合に、デフォルトで自動的に Ruby アプリにプロビジョニングされます。この記事では、この動作をオプトアウトする方法と Heroku Postgres 以外のデータベースを使用する方法について説明します。
この記事は、2023 年 5 月 15 日より前に作成されたアカウントまたは Heroku サポートにアカウントの自動プロビジョニングを有効にするように依頼した場合にのみ該当します。
Heroku Postgres データベース自動プロビジョニング動作
Heroku buildpack は v2 buildpack リリース API を通じてアドオンを自動プロビジョニングできます。heroku/ruby
buildpack は、以下のすべての条件があてはまる場合に、この API を使用して Heroku Postgres データベースをプロビジョニングするように要求します。
- 2023 年 5 月 15 日より前にアカウントを作成しているか、Heroku サポートにアカウントの自動プロビジョニングを有効にするように依頼した。
heroku/ruby
buildpack が初回デプロイで最後に実行される buildpack である。HEROKU_SKIP_DATABASE_PROVISION
環境変数がアプリケーションに設定されていない。- これらのうちいずれかの PostgreSQL gem が
Gemfile.lock
にある
データベースの自動プロビジョニングのスキップ
2023 年 5 月 15 日の後に作成されたアカウントは、Heroku サポートにアカウントに対してその機能を要求していない限り、アプリにデータベースを自動プロビジョニングしません。
その日より前にアカウントを作成したか、サポートに自動プロビジョニングを有効にするように依頼した場合、HEROKU_SKIP_DATABASE_PROVISION
環境変数に何らかの値を設定して、アプリごとに自動プロビジョニングをオプトアウトできます。
$ heroku config:set HEROKU_SKIP_DATABASE_PROVISION=1
この設定により、そのアプリのデータベース自動プロビジョニングがスキップされます。Review Apps の場合、この環境設定をパイプライン設定の Review app config vars
(レビューアプリ環境設定) セクションに設定できます。
この環境変数は、heroku/ruby
ユーザーにのみ、および初回デプロイに成功しなかったアプリケーションにのみ影響します。自動プロビジョニングされたデータベースを使用してすでにデプロイされたすべてのアプリケーションで、アドオンを手動で削除する必要があります。
この環境変数のインターフェースは実験的であり、今後変更されます。変更を行う前に、heroku/ruby
buildpack からデプロイに関する非推奨の警告と詳細情報が提供されます。
Rails での別のデータベースの使用
Heroku Postgres 以外のデータベースを使用している場合、Rails アプリ用に Postgres データベースをプロビジョニングする動作は、既存の設定と矛盾する可能性があります。Heroku によってアプリケーションの Heroku Postgres データベースが自動プロビジョニングされると、DATABASE_URL
環境設定が設定されます。Heroku 上の Rails のすべてのバージョンで、DATABASE_URL
環境変数の情報が優先されます。アプリケーションは自動プロビジョニングされた Heroku Postgres データベースにデフォルトで接続しようとするため、この動作は Postgres データベースを使用しない場合に問題となります。
Rails アプリ用に Heroku Postgres 以外のデータベースを使用する必要がある場合は、データベースの自動プロビジョニングをオプトアウトします。
自動プロビジョニングをオプトアウトしない場合は、自動プロビジョニングされた Postgres データベースを削除します。
Rails の各バージョンとデータベースの正しい接続についての詳細は、「Rails データベース接続の動作」を参照してください。
Review Apps での別のデータベースの使用
コード内で DATABASE_URL
の値を動的に割り当てることができます。この値はデータベースが初期化される前に割り当てる必要があります。次に例を示します。
ENV["DATABASE_URL"] = "mysql://#{ ENV['MY_DATABASE_PASSWORD'] }:#{ ENV['MY_DATABASE_USERNAME'] }@#{ ENV['MY_DATABASE_HOST'] }"
このコードは、イニシャライザに配置することも、config/database.yml
の ERB コードセクションの内側に直接配置することもできます。重要なのは、アプリケーションがデータベースに接続しようとする前にこのコードが実行されることです。