Ruby on Rails5 + Heroku で検証環境を構築する

Yuji Tsuburaya
Feb 3, 2018 · 8 min read

indies.band というWEBアプリケーションを何人かで作っています。
2017年の12月にリリースし、おかげさまで順調に投稿数は伸びていっております。リリースからの数値の推移はこちらに書いた通りです。

さて、今後もこのサービスを安定稼働させていくためには、0→1 でサービスを開発したときとはまた少し違ったアプローチが必要になります。お恥ずかしながら、リリースまではとにかくスピード(という名の勢い)を最優先にしてきました。とにかく高速でワイヤーを作り、コードを書きなぐり、ローカルでざっくりと動作確認をして、動けばそのまま本番環境にデプロイ! という、仏の開発者も鬼の形相になるような開発スタイルでした。

サービスを2ヶ月稼働させ、そこそこユーザー数も増えてきて「さすがにこのままだとヤバイ」という危機感を持ち、検証環境を準備しました。ローカル開発環境 + 検証環境(Heroku) + 本番環境(GCP) という開発基盤がようやく整ったので、今日はその手順を書き残しておきたいと思います。


検証用サーバには Heroku の無料プランを使用。ざっくり以下のような手順で環境構築を行いました。

Rails側設定

・Gemfile
・database.yml
・staging.rb
・secrets.yml
にステージング環境用の情報を追記。

Heroku側設定

・(Herokuのアカウントを作成 heroku コマンドが叩ける状態になっているのが前提)
・Herokuプロジェクト作成
・MySQLアドオンのインストール
・DB接続情報修正

デプロイ

・DBマイグレーション
・デプロイ

それぞれについて以下で詳しく解説します。


Rails側の準備

Gemfile に以下を追記します。

今回、検証環境には staging という名前を付けました。ここに、検証環境で使用するDBを記載します。本番環境で MySQL を使用しているので、検証環境でも MySQLを使用することにしました。

database.yml の編集

以下のように検証環境のデータベース接続用の記述を追記します。上で記載した staging と名前を一致させる必要があります。 adapter には使用する DB を記載します。今回は MySQL なのでこのように記載しましたが、他の DB を使う場合には適宜書き換える必要があります。PostgreSQLの場合には adapter: postgresql など。

staging.rb を作成

config/environments 以下に、新規に staging.rb というファイルを作成します。例によって名前は作成する環境名と一致させる必要があります。既に、本番環境用とローカル開発環境用の設定ファイルが入っていると思います。今回は、本番環境とほぼ同じ動作をさせたいので、本番環境用の、 production.rb の中身をそのままコピーして作成します。

ログレベルだけ次のように修正しておくと、検証環境でもしエラーがあった場合にデバッグが容易になるので、確認しておきましょう。

secrets.yml の編集

config/secrets.yml に以下を追記します。ここも名前を一致させておきましょう。

以上でRails 側の設定は終了です。

Heroku の設定

前提として、Heroku のアカウントは作成済で、heroku コマンドが叩ける状態になってることとします。

で新規 Heroku プロジェクトを作成します。名前はユニークにする必要があります。

で、 Heroku に MySQL のアドオンを追加します。これで MySQL が使用可能になります。heroku config コマンドで、以下のように設定情報が表示されればOKです。

デフォルトだと、 CLEARDB_DATAVBASE_URL と、 DATABASE_URLmysql となっているので、これを以下のコマンドで、 mysql2 に変更します。

これで Heroku 側の設定も完了です。

Heroku にデプロイする

ここまでの設定が終わったら、Heroku にデプロイします。

DBマイグレーションを以下のコマンドで実行します。

デプロイは以下のコマンド。

master 以外のブランチを push したい場合には、以下のようにブランチ名を記載すればOKです。

ファイルを書き換えた場合、git commit する前に push しても差分がないと怒られるので注意です。

でアプリケーションが開ければ無事終了です。お疲れ様でした!

ハマったところ

ググりながら約2時間くらいで検証環境を作ることが出来ました。少しハマったところがあったので、それも書き残しておきます。

SQL の違いでアプリケーションが動かない

最初は PostgreSQL で検証環境を構築したのですが、うまくアプリケーションが動きませんでした。

でエラーログを監視してみると、どうやらデータベースの挙動の違いらしく、MySQL では正常に解釈されるのに PostgreSQL では正常に解釈されませんでした。カラム名のキャメルケースで記載しているのが悪かったようです。以下がエラーログ。

以下のコマンドで PostgreSQL アドオンをアンインストールし、上記の手順で MySQL をインストールし直したら正常に動きました。

デプロイ時のエラー

デプロイコマンドを叩くと、 Gemfile を自動で認識して、 bundle install を実行してくれるのですが、そこでエラーが出ました。

bundle installが失敗して、 push できなかったよと言っています。 gemfile に問題があるのかと思い、何度か確認したのですが、 gemfile には問題はなさそうでした。

結論は、 database.yml の記載が間違っていたのが原因でした。このように、エラーログに直接エラーが出ない場合もあるので、エラーが出た場合は書き換えたファイルの設定値をもう一度全て見直して見ると良いと思います。

さいごに

調べながら環境構築を進めたのですが、色々な記事の情報を集約してなんとか動きました。うまくまっている記事が無かったので、この記事がその役割を果たせたらなと思います。

indies.band

新機能リリースと技術ブログを書きます。

Yuji Tsuburaya

Written by

株式会社ビズリーチのフロントエンドエンジニア。個人開発もやってます。

indies.band

新機能リリースと技術ブログを書きます。

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade