経緯
個人開発にて小規模なアプリを制作していく中で、DBはテーブル数が少なく外部キーや複雑な制約を持たないシンプルな設計のため、ローカルにDBを立てず本番環境で使用予定であるNeonのブランチ機能を使って開発環境用のDBを構築してみることにしました。
クラウドに開発用DBを構築するメリット・デメリット
クラウドに開発環境用のDBを置くことにより以下のメリットがあると考えています。
- 本番と差異の無い開発環境を構築出来る
- ローカルにDBサーバーを立てる手間が不要
- ローカルの環境に起因するDB周りのトラブルが防げる
反対に、以下のデメリットが挙げられると考えます。
- DB環境がネット環境に依存する
- ローカルDBでは感じないレイテンシ(遅延)が発生する
- 本番環境と隣り合わせの環境のため、設定ミスや操作ミスが本番環境のデータ破壊につながりかねない
これらを踏まえると、ローカルDBであれば接続先を誤るリスクがなく、最悪の場合でも環境を作り直せるため破壊的な検証を心理的負荷なく行うことができます。
ローカル環境で実装・検証を行い、その後クラウドのdevelopブランチで試行したうえで最終的にmainブランチへ反映する、という運用がより安全で確実そうです。
実装内容
Neonのブランチ機能を使用し、developブランチに開発環境用のDBを構築
環境
- Windows
- WSL2
- Docker
- Rails 7.2
- Ruby 3.3
- postgreSQL
実装手順
本記事では、Neonでのユーザー登録、プロジェクト作成については省略します
1. gem pgのインストール
RailsでpostgreSQLを使用するためのgemを追加します。
# gemfile
gem "pg"
# terminal
bundle install
2. 該当プロジェクトにてdevelopブランチの接続パスを取得
1. プロジェクトのダッシュボードにて、サイドメニューのBRANCHからdevelopmentを選択します

この時、Branchがdevelopmentであるか確認しておきます

3. .envファイルに接続設定を記述
上の画像のconnection stringが接続パスで、以下のように書かれています。
psql 'postgresql://neondb_owner:kokogapassword@ep-kokoni-arunoga-hostname-dayo.ap-southeast-1.aws.neon.tech/neondb?sslmode=require'
構造としては以下の通りです
postgresql://<DB_USER>:<DB_PASSWORD>@<NEON_HOST>/<DB_NAME>?sslmode=require
gitでプロジェクトを管理しているため、開発環境用のDB接続情報として.env ファイルにdevelopブランチの接続設定を記述します。
上記した接続パスを例にすると以下のような記述となります。
# .envファイル
# ホスト名
DATABASE_HOST="ep-kokoni-arunoga-hostname-dayo.ap-southeast-1.aws.neon.tech"
# データベース名
DATABASE_NAME="neondb"
# データベースユーザー名
DATABASE_USER="neondb_owner"
# パスワード
DATABASE_PASSWORD="kokogapassword"
4.database.ymlに環境変数の設定
.envファイルに書いた接続設定を読み込ませるため、config/database.ymlに環境変数をセットします。
# config/database.yml
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS", 5) %>
host: <%= ENV["DATABASE_HOST"] %>
database: <%= ENV["DATABASE_NAME"] %>
username: <%= ENV["DATABASE_USER"] %>
password: <%= ENV["DATABASE_PASSWORD"] %>
sslmode: require
5.接続確認
# terminal
rails db:version
=> database: neondb
上記のコマンドを実行し、DBのバージョンが出力されれば接続が成功しています。
より厳密に確認したい場合は、以下のコマンドを実行することで確認が可能です。
# terminal
rails c
ActiveRecord::Base.connection_db_config.host
=> # ホスト名が出力されるので、Neonのdevelopブランチの情報と相違ないか確認可能
実際にテーブルを作ってみる
# terminal
rails g model Comment body:string
rails db:migrate
Neonのプロジェクトからテーブルを確認してみるとcommentテーブルが出来ており、カラムも反映されていることが確認できました

以上


