環境変数の設定!Railsアプリで使用

f:id:endoakak:20200725103727j:plain

環境変数の設定の仕方やRailsアプリでの使い方です。

環境変数とは

簡単に言えばOSに保存しておく変数、ということでいいと思います。環境変数に値を設定すると、シェルが簡単にその値にアクセスすることができます。

環境変数を設定するメリット
  • 秘密鍵やパスワードなど漏洩のリスクがあるものを、ファイルに直接記述せずに使用できる
  • アプリケーションのコマンドをどのディレクトリからでも使用できる
PATHを通す

環境変数にアプリケーションの場所を設定しておくことで、シェルはどこからでもそのアプリケーションの場所を検索できます。そのため、アプリケーションのコマンドをどのディレクトリからでも使用することが可能になります。このような作業を、PATHを通すと言います。

Mac環境変数を設定

OSはCatalinaを想定しています。Mojave以前だと違うところもあるらしいです。

環境変数の設定は、.zshrcというファイルに記述を追加するだけでOKです。

その1

コマンドでファイルに記述を追加します。

% echo 'eval "$(rbenv init -)"' >> ~/.zshrc

これは、rbenvのPATHを通すときに実行したものです。echo 値 >> ファイルで、ファイルに値を記述することができます。

.zshrcに記述を追加した後は、次のコマンドを実行してファイルを再読み込みする必要があります。

% source ~/.zshrc

その2

ファイルに直接記述を追加します。

まずは以下のコマンドを実行します。

% vim ~/.zshrc

このコマンドを実行すると、ターミナル上で.zshrcのファイルが開きます。iと入力すると編集モードになるので、必要な記述を追加します。

export BASIC_AUTH_USER='xxxxx'

BASIC認証のユーザー名を設定しました。

記述を追加したらescキーを押して編集モードを抜け、:wqと入力して終了します。

% source ~/.zshrc

最後に、.zshrcの再読み込みをして完了です。

ちょっとつまづいた注意点

初めてBasic認証を導入したとき、環境変数を設定してもアプリが思ったような動きをせず困りました。

原因はターミナルのタブを二つ開いて、片方のタブでサーバーを動かしつつもう片方のタブでコマンドの実行を行なっていたことでした。

どうやら.zshrcの編集や読み込みをしたのと同じタブで、rails sを行いサーバーを立ち上げる必要があるみたいです。別のタブでサーバーを立ち上げても.zshrcの編集が反映されないので、アプリ内で環境変数を使えません。

Railsアプリで環境変数を使う

ENV[]の中に設定した環境変数を入れるだけです。

payjp.api_key = ENV["PAYJP_SECRET_KEY"]

payjpというAPI秘密鍵環境変数に入れたときはこのように使いました。

payjpを使うときはJavaScriptのファイルでも環境変数が必要なのですが、JSで環境変数を使うには、config/initializers/webpacker.rbに以下のような記述を追加します。

Webpacker::Compiler.env["PAYJP_PUBLIC_KEY"] = ENV["PAYJP_PUBLIC_KEY"]

これで以下のようにJSファイルでも環境変数の使用が可能です。

Payjp.setPublicKey(process.env.PAYJP_PUBLIC_KEY);

Heroku上でも設定

HerokuにデプロイしたRailsアプリで環境変数を使うときは、そのアプリのディレクトリで、以下のようにコマンドを実行して環境変数を設定します。

% heroku config:set BASIC_AUTH_USER="xxxxx"

また、heroku configというコマンドを実行すると、設定されている環境変数を確認できます。

まとめ

  • 環境変数の設定は.zshrcというファイルに書き込めばOK
  • RailsアプリではENV["設定した変数"]という感じで使える
  • Herokuにデプロイする場合、Heroku上でも環境変数を設定する必要がある

使い方はわかったけど詳しい仕組みは理解できてないから要勉強