Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

本番環境へ向けてRailsアプリを設定する方法 ― 環境変数とYAMLファイルの賢い使い分け

初めての本番アプリをローンチする準備が整い、外部サービスとの連携を始める段階に来ました。しかし、まだすべてを接続する作業が残っています。開発マシンを複雑にすることなく、本番環境でサービスを設定する最良の方法とは何でしょうか?

まずは環境変数で環境を整えよう

本番アプリを設定する際、現在のベストプラクティスは環境変数(ENV["REDIS_HOST"]のようなもの)を使うことです。

では、なぜ環境変数なのでしょうか?主な理由は次の3つです。

  • 本番用のキーを誤ってコミットするリスクが減る

    うっかりgit pushで重要なシークレットキーを含むファイルをリポジトリにプッシュしてしまうと、取り返しのつかない、そして高くつくミスになりかねません。

  • 設定のために環境変数は存在している

    環境変数は、ほぼあらゆるシステムでアプリを設定するための標準的な手段です。Rubyをはじめ多くのプログラムも環境変数を設定に利用しているため、自分のアプリでも自然に採用できます。

  • 本番環境で簡単に設定できる

    Herokuには環境変数を手軽に設定できるWeb UIとコマンドラインツールが用意されています。自前でサーバーを構築する場合でも、ChefやDockerといったサーバー管理ツールを使えば環境変数の設定は簡単です。

Rails側ではどのように書くのか?

環境変数に依存するアプリは、次のように自己設定できます。

config/my_service.yml

production:
  host: <%= ENV["MY_SERVICE_HOST"] %>
  port: <%= ENV["MY_SERVICE_PORT"] %>

config/initializers/my_service.rb

my_service_config = Rails.application.config_for(:my_service)

my_service = MyService.new(my_service_config["host"], my_service_config["port"])

このイニシャライザは、Rails 4.2で導入されたconfig_forメソッドを使って、適切な.ymlファイルを見つけ、対応する環境のセクションを読み込みます。

続いてconfig_formy_service.yml内のERBコードを実行し、環境からMY_SERVICE_HOSTMY_SERVICE_PORTの値を取得します。その値がMyServiceに渡されるという流れです。

イニシャライザで直接ENV["MY_SERVICE_HOST"]を読むことも可能ですが、後述する理由から、.ymlファイルにまとめておくことをおすすめします。

開発環境・テスト環境での設定の扱い方

環境変数は本番環境にはぴったりです。しかし、本番用の設定を整えたら、開発モードやテストモードはどう扱えばいいのでしょうか?

選択肢はいくつかありますが、筆者はRailsのconfig/secrets.ymlにおける慣習に従うのがおすすめだと考えています。つまり「本番では環境変数を使い、開発とテストではシークレットでない値をハードコードする」という方針です。

開発・テスト環境を含めると、config/my_service.ymlは次のようになります。

production:
  host: <%= ENV["MY_SERVICE_HOST"] %>
  port: <%= ENV["MY_SERVICE_PORT"] %>

development:
  host: localhost
  port: 8081

test:
  host: localhost
  port: 8081

嬉しいことに、イニシャライザは一切変更する必要がありません。このファイル内の値は開発・テスト環境で使われ、本番環境では環境変数から値が取得されます。

では、なぜ開発環境では値をハードコードするのでしょうか?

  • 設定値の確認と変更が容易になる

    新機能を試しながら設定を細かく調整できます。これは開発環境では望ましいことですが、本番環境では頻繁に行いたくない操作です。

  • 新しい開発者がすぐに参入できる

    必要なサンプル設定がすべてGitリポジトリにコミットされていれば、新しい開発者はクローンして実行するだけで済みます。アプリを動かすために適切な値を探し回る手間がありません。

  • 環境変数の競合を心配しなくてよい

    開発マシン上では、1台の本番サーバーにデプロイするよりも多くのアプリを扱うことになるでしょう。すべてのアプリをシステム全体の環境変数で設定すると、複数のアプリが互いに干渉する可能性が高くなります。

というわけで、本番では環境変数、開発ではハードコードした.yml設定を使ってみてください。シンプルで読みやすく、しかもRailsにはまさにこの種の設定ファイルを扱うための組み込みサポートが備わっています。

開発環境のもう一つの選択肢:dotenv

開発モードでの設定管理には、もう一つの方法があります。それがdotenvです。非常に便利そうですが、筆者自身のアプリで試したことはまだありません。

dotenvを使うと、Railsアプリのルートディレクトリに.envというファイルを置き、そこに環境変数を記述できます。アプリは自動的にその値を読み込みます。これにより、開発環境が本番環境により近い挙動になります。「本番でしか発生しないバグ」を防ぐ有効な手段と言えるでしょう。

いずれ試してみたいと思っていますが、現時点では.ymlconfig_forの組み合わせ以上に便利なものは見つかっていません。

まとめ

ほとんどの本番アプリには何らかの設定が必要です。次にアプリをデプロイするときは、本番では環境変数によって値が埋め込まれる.ymlファイルを使って設定してみてください。柔軟性、シンプルさ、そして信頼性という、求めていたものがきっと手に入るはずです。

本番アプリの設定について、別のお気に入りの方法をお持ちですか?ぜひコメントで教えてください!

  1. PCでTelegramを使う方法|デスクトップアプリとWeb版の導入手順を徹底解説

    Telegramは、プライベートメッセージングの世界において、堅牢なセキュリティを誇る数少ないアプリの一つとして高い評価を得ています。電話番号ではなくユーザー名で新しい相手とつながれる仕組みを採用しているため、プライバシーを重視するユーザーの間で人気の選択肢となっています。あらゆる安全な通信の決定打というわけではありませんが、自分のやり取りを目立たない状態に保つうえで大きな助けになります。 ユーザー数が着実に増え続ける中、その一部がPCからTelegramへアクセスしたいと考えるのは自然な流れです。幸い、他の人気メッセージングアプリと同様に、TelegramもPCにインストールして快適に利用で

  2. Windows 10の「Your Phone」アプリの使い方!スマホとPCを連携させる完全ガイド

    スマホで撮った写真をパソコンに移すのに苦労していませんか?別のデバイスでファイルを使うために、自分宛てにメールで送ったり、USBケーブルで接続したりしていませんか?実は、Windows 10の最新機能「Your Phone(スマホ同期)」アプリを使えば、こうした手間のかかる作業からすべて解放されます。Your Phoneアプリは、PCとスマートフォンを行き来するストレスからあなたを自由にしてくれる便利なツールです。PCで作業中にスマホの写真へアクセスできないのは、作業効率を大きく下げる要因になりがちです。 Microsoftはこの機能を1年以上にわたりWindows Insiderプログラムで