Railsアプリを作っていて「環境変数が設定されていないのでエラーになる」などの文言に出会ったことが何度か・・・。 「開発環境」「本番環境」などの言葉があるので、アプリで環境変数を扱う場合、環境=開発・ステージング・本番のどれか、というイメージを持ってしまって挙動がうまくできませんでした。 だけれどもどうやら違うぞ、環境変数についてきちんと抑えないといつまでたっても環境変数でつまづいてしまうのではと思ったので再学習しました。
そう、これは再学習。環境変数自体は一回やったはずなんだけどな・・・。
だけどアプリを絡めて環境変数をどう扱うのか整理できたので再学習してよかったです。
環境変数とは
環境
開発環境や本番環境とかの環境は別物だそうです!!(知らんがな!って思った。)
環境変数でいう環境とはOSの事を指しているそうです。
「環境」っていう言葉が厄介に思えるのはわたしだけでしょうか・・・(あんま聞かないから多分私くらい)
プロセス
プログラムを実行する単位のことを「プロセス」といいます。
例えば「rubyプログラムを実行する」とか「ブラウザを起動する」とか。 「シェルを起動する」というのは1プロセスです。
変数(シェル変数)
シェル上で作った変数を「シェル変数」といいます。 単に変数と呼ぶ方が多いのかも?なので以下変数とします。
変数は1プロセス上で有効です。 起動中のシェルで作った変数はそのシェル上で有効です。「シェルを起動する」というのは1プロセスなので、シェルを終了すると消えてしまいます。シェルを再起動したり別のシェルを立ち上げたりしても先ほどの変数は存在しません。
変数の作成と参照
$ NAME=neko # 変数の作成。"="で代入。 =の前後にスペースは入れない。 $ echo $NAME # echo:文字列を画面に表示。 $:変数を参照。 neko
環境変数
シェル変数は現在実行中のシェルだけで有効な変数ですが,環境変数はシェルから実行したコマンドにも引き継がれる変数です。
シェル=親
シェルから実行したコマンド=子
子からさらに実行したコマンド=孫
のように親子関係で呼びます。
親で作った変数はシェルのなかで有効で、子や孫には無効。
親で作った環境変数は子でも孫でも有効です。
環境変数の作成と参照
変数のとほぼ同じですが、代入する時にexport
とつけることで環境変数となります。
$ export NAME=neko # export:環境変数を作る $ echo $NAME neko
環境変数も親を終了させると消えてしまいます。 そうしないためには、環境変数を保存するファイルを作って実行するという方法があります。
Railsと環境変数
Railsアプリは例えばRails server
コマンドでアプリを起動しますが、そのRails server
コマンドはシェルでたたきます。そのシェルとの関係でいうとシェルが親でRailsアプリは子にあたります。
したがって、親(シェル)で子(Railsアプリ)にも有効な環境変数を作成しRailsの中で呼び出して使っていきます。
環境変数を使う理由
大きく分けて2つ理由があります。
- セキュリティの問題
- 外部接続の問題
1.は例えばパスワードとか、API連携に必要なKeyとか。外部に知られたらやばい!っていう情報を環境変数として取り扱いソースコードからは分からないようにします。
2.はDBが代表的な物のようです。 同じソースコードを持つRailsアプリでも、例えば開発環境と本番環境(この環境は環境変数の環境とは違う・・・)では異なるDBを使用します。どのDBを利用するのか指定するためにはDBのURLが必要ですがそれを明示的にソースコードの中に書くと、コードをpullするたびに書き換えないといけないだとか、気づかなければ誤ったDBを利用することになってしまいます。
Railsアプリの環境変数の作成と参照
シェルで環境変数を作成し、Railsアプリで呼び出します。
シェルで環境変数を作成するのは上記と同様
$ export PASSWORD=neko
Railsアプリにある、その環境変数を呼び出したいファイル内で以下記述します。
ENV["PASSWORD"]
設定方法
シェルで環境変数を作りますが、そのまま親を終了すると環境変数は消えてしまいます。 それだとRailsアプリを起動するためには度々環境変数を作らなければなリません。その手間を解消するために環境変数を保存するためのファイルを作り、シェルの起動やRails起動のタイミングでそのファイルを呼び出せるようにする方法があります。 シェルの起動時に呼び出せるようにしたければシェルでファイルを作り、Rails起動時に呼び出せるようにするにはRails内にファイルを作ります。そういう時にdotenvなどのrubygemを使うと簡単に効率よく管理ができます。