【Rails】本番環境における環境変数の設定方法を3パターン試す

投稿日:

【Rails】プログラミング初心者の勉強ブログ #74

さくらVPS+CentOS7+Nginx+Unicorn+Capistrano+PostgreSQLでRailsアプリ本番環境構築中、環境変数設定で詰まり、3種類の環境変数設定を試しました。環境変数とシェル変数の違いや.bashrcと.bash_profileの違いなどを確認していきます。

 

目次

 

環境変数について今一度確認する

Railsの勉強をしている中で、今までの僕の環境変数の認識として、「.envファイルに書き込んでENV["HOGE"]で呼び出せる変数」くらいにしか知識がなく、知識がなくともHerokuでデプロイすれば、なんかわからないけど本番環境で読み込んでくれたので、知るきっかけもありませんでした。

それが今回、VPSで環境構築してアプリをデプロイしてもENVが反応せず、途方に暮れてしまいました。そこで、今一度Railsアプリにおける環境変数について確認していこうと思います。

環境変数とは

環境変数とはコンピュータさんが持っている、値を入れておく箱(変数)。

もう少し具体的に書くとコンピュータの人格に相当するソフト(OS)が動いているときに使える変数でありすべてのプログラムで一緒に使える「みんなで仲良く使ってね~」な変数です。

環境変数とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

環境変数はコンピューター単位で受け渡しを行う変数です。Railsの「インスタンス変数」が、「コントローラーとビュー」間で使用するのに対し、環境変数は「コンピューターとコンピューター」間で使用する変数ということである。

 

環境変数とシェル変数の違い

環境変数と似たようなもので、「シェル変数」というものが存在します。

シェル変数とはシェルが持っている、値を入れておく箱(変数)
でありシェルが動いているときに使える変数です。

シェル変数とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

同じサイトの引用です。環境変数が「コンピューター(OS)単位」であるのに対し、シェル変数は名前の通り「シェル単位」の変数であるという違いです。

シェル変数と環境変数の違いをコマンドラインで確認する - Qiita

上の貼ったQiitaなどを見ると、具体的な違いがわかります。

環境変数を設定するために、「exportコマンド」と「sourceコマンド」を利用していたのですが、これらを試しに使用していたとき、環境変数が反映されていたりされていなかったりと、よくわからなくなってしまいました。その原因の一つが「シェル変数と環境変数という2種類」が存在することを知らなかったためでした。

(もう一つは「環境変数は毎回読み込ませなければならない点」です。ものすごく初歩的な話ですが、一回exportなどで設定したらそれでOK、というわけではないということです。環境変数は、起動のタイミングで毎回読み込ませないとならないという「仕組み」をそもそも知りませんでした。)

細かい違いはまるでわかりませんが、とにかく「そのシェルのみ有効なシェル変数」と「引き継がれる環境変数」という2つが存在するということを知っていれば、エラーの原因を狭めることができると思います。

 

【exportコマンド】

「export」は、環境変数やシェル変数を設定するコマンドです。Linux環境で使用する変数には、シェルからのみ参照できる「シェル変数」と他のコマンドからも参照できる「環境変数」があります。

exportには2つの使い方があります。1つは環境変数を定義すること、もう1つはシェル変数を環境変数に、あるいは環境変数をシェル変数に変更することです。

【 export 】コマンド――環境変数やシェル変数を設定する:Linux基本コマンドTips(174) - @IT

 

【sourceコマンド】

「source」コマンドは、ファイルに書かれたコマンドを現在のシェルで実行する、というコマンドです。主にシェルの設定ファイルを反映させる際に使用します。

sourceコマンドはシェルに組み込まれたビルトインコマンドで、bashやtcsh、zshに共通して使用できます。ビルトインコマンド「.」の処理内容は、sourceと全く同じです。

【 source 】コマンド/【 . 】コマンド――シェルの設定を即座に反映させる:Linux基本コマンドTips(169) - @IT

exportコマンドとsourceコマンドはこのような感じです。とりあえず思ったことは、「シェル」について勉強しないとついていけないということです。今の所理解は浅いです。

 

Railsアプリ本番環境における環境変数設定の種類

今回試した環境変数設定方法は以下の3種類です。

  1. dotenv-railsというgemの利用
  2. .bash_profileファイルの利用
  3. .bashrcファイルの利用

今回の僕の場合「3.  .bashrcの利用」でうまくいきました。構築した環境ごとに変わってくるもので、環境変数設定が上手くいかない場合は、とにかく色々な方法を試すしかなさそうです。

少し調べた限りでは、「dotenvは使わない方が良い」的な記事や、「.bashrcが一番良いのでは」みたいな記事も見ました。実際.bashrcで上手くいったので僕もそう感じます。

「.bash_profile」を使うのが一般的らしいのですが、railsの場合は「doting-rails」という、環境変数設定用のgemが用意されているので、そちらを使ってみたい気分にもなります。

ユーザーの環境変数を設定するbashの設定ファイルと、カスタムプロンプトについて | OXY NOTES

上のリンクに「.bash_profile」と「.bashrc」について詳しく載ってます。

 

実際の設定方法

「.bash_profile」と「.bashrc」について設定方法を書きます。

 

本番環境サーバーにssh接続後、

ホームディレクトリにファイルを作成し、

.bashrc

中に環境変数を記入し、

sourceコマンドを打ち込みます。

ポイントは頭に「export」がつくことと、変数に「ダブルクォーテーション」をつけることです。.envファイルの書き方と少し異なります。(.bash_profileも同じです。)

ここら辺はファイル作成時デフォルトで書き込まれてます。「/etc/bashrcがあったら読み込んで」といった内容です。

 

記入したら「sourceコマンド」を実行したのち、アプリケーションサーバー(今回の場合unicorn)を再起動します。

 

環境変数の確認

設定したらちゃんとセットされているか確認したいです。

「echo」コマンドを使うと、そこで設定されている環境変数を表示できます。何も出てこなかったら、何かしらの不具合で設定できていない、ということです。そこでその変数は使えません。

「printenv」コマンドを使うと、設定した環境変数の一覧が表示されます。

こちらも「echo」コマンドと同様、出てきていない変数は使えません。

 

「.bashrc」と「.bash_profile」の違い

両者は基本的には同じです。bashというシェルのときに読み込まれるファイルだそうです。一つだけ違うのが「タイミング」とのこと。

.bushrcが「bash起動時」

.bash_profileが「bashの状態でのログイン時」

 

「.bashrc」と「.bash_profile」の違い|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

これも上のリンクに載っております。この「タイミング」の違いが、環境によって読み込んだり読み込まなかったりを起こしてるんじゃないかなと。

まあ上のリンクの記者の方は、

まず「.bash_profile」の中で「.bashrc」を読み込むように設定しています。ログイン時に「.bashrc」を読み込むためです。あとは、ログインしたときに一回だけ設定したい内容は「.bash_profile」に書いています。それ以外の設定は「.bashrc」に書いています。

……というのが、建前です。
私はtcsh派なので、そもそもbash自体を滅多に使いません。ですから、bashの設定ファイルも使ってはいません。

とか書かれていて、そもそも「tcsh派」とか聞くと、まだまだ色々あるんだなと、奥の深さを感じます。徐々に知っていこうと思います。徐々に。

 

まとめ

とりあえず環境変数がなんとか読み込まれたので、これで本番環境でAPIが使えるようになりました。本番環境でWheneverの設定して、Twitter API動かしていきたいと思います。

以上ありがとうございました。

-プログラミング学習
-, ,

Copyright© s u p ? , 2019 All Rights Reserved.