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

Rubyで環境変数を使う方法|ENVオブジェクトの操作から設定・Rails credentialsまで徹底解説

環境変数とは、次のような「キーと値」のペアとして表されるデータのことです。

KEY=VALUE

この変数は、パソコン上で動くすべてのプログラム間で設定情報(コンフィグ)を共有するために使われています。

だからこそ、環境変数がどのような仕組みで動作し、Rubyプログラムから特殊な ENV オブジェクトを使ってどうアクセスするのかを学んでおくことが大切なのです。

環境変数の活用例

  • デフォルトエディターの設定
  • Rubyにgemの保存場所を伝える(GEM_PATH / GEM_HOME)
  • APIキーをGitリポジトリにコミットすることなくアプリケーションへ渡す
  • OSがバイナリファイル(Windowsなら.exeなど)を検索する場所を定義する
  • Railsをtest / development / productionモードで起動させる

LinuxやMacでは env コマンド、Windowsでは set コマンドを実行すると、すべての環境変数の一覧を確認できます。

実行例:

PWD=/home/jesus
SHELL=/usr/bin/zsh
RUBY_ENGINE=ruby
RUBY_VERSION=2.6.0
GEM_ROOT=/opt/rubies/ruby-2.6.0/lib/ruby/gems/2.6.0

# ...

一覧はかなり長くなりますが、暗記する必要はありません。

また、gem env コマンドを使えば、gem固有の変数や設定をすべて出力できます。

では、これらの環境変数をRubyから参照するにはどうすればいいのでしょうか?そのための特別なオブジェクトが用意されています。早速見ていきましょう!

Rubyで環境変数を扱う

Rubyには ENV というオブジェクトが用意されており、ハッシュのように振る舞います。これを使うことで、利用可能なすべての環境変数にアクセスできます。

以下にいくつか例を挙げます。

キーの数を調べる:

ENV.size
# 48

キーの一覧を取得する:

ENV.keys

特定のキーにアクセスする:

ENV["GEM_HOME"]
# "/home/jesus/.gem/ruby/2.6.0"

mapselect といったメソッドもそのまま使えます。

ENV.select { |k,v| k.size < 4 }

では、Rubyの外側で環境変数を設定するにはどうすればよいのでしょうか?

環境変数の設定方法

コマンドの先頭に変数を付ければ、一度きりの利用を目的とした環境変数を設定できます。

次のように書きます:

API_KEY=1 ruby -e 'p ENV["API_KEY"]'

irbではなくターミナル上でこのコマンドを実行すると、Rubyは API_KEY の値にアクセスできるようになります。

これはAPIキーを渡すときだけでなく、Railsの動作モードを指定するときにも役立ちます。

例:

RAILS_ENV=production rails console

注意点:

この方法で設定した環境変数は、「今まさに起動しようとしているプロセス」に対してのみ有効です。

つまり、API_KEY=1 <command> と書いた場合、その変数はそのコマンドでしか使えません!

現在のターミナルセッションから起動するすべてのコマンドで同じ変数を使いたい場合は、次のようにします。

export API_KEY=1

こうすると:

ruby -e 'p ENV["API_KEY"]'

先頭に変数を付けなくても 1 が出力されます。

警告:

Rubyアプリケーション内部の設定に ENV を使うのは避けましょう。それはENVの本来の用途ではないからです。ENVは、Rubyの外部からやってくる設定を読み取るためだけのものです。

アプリ内部の設定には dry-configurable のようなgemを検討してみてください。

環境変数の重要な性質

以下の性質を知っておくと、予想外の挙動に遭遇したときの理解に役立ちます。

  • スナップショットとして扱われる: 環境変数はプログラム起動時に読み込まれ、その後の外部からの変更の影響を受けません
  • 閉じた環境である: プロセス内(Rubyプログラム自体も一つのプロセスです)で変数を変更しても、プロセスの外側にある環境変数は変わりません
  • 永続化されない: パソコンを再起動したり、ターミナルを閉じたりすると、環境変数への変更は失われます(export コマンド(Linux/Mac)や set(Windows)を使った場合でも同じです)

これらのポイントはぜひ覚えておいてください!

RailsのCredentials機能

Rails 5.2では、APIキーなどを安全に管理するための新しい仕組みが導入されました。

この仕組みでは、認証情報を config/credentials.yml.enc という暗号化されたファイルに直接保存します。このファイルは master.key ファイルがなければ復号して読むことができません。

基本的な考え方は、「credentials.yml.enc だけをコミットし、鍵(master.key)は秘密にしておく」というものです。

では、新しい認証情報を追加するにはどうすればよいのでしょうか?

.enc ファイルは直接編集できません。

代わりに次のコマンドを使います:

bin/rails credentials:edit

編集するのはYAML形式のファイルなので、正しい書式で記述するように注意してください。

そして、Railsアプリからは次のように認証情報を読み出せます。

Rails.application.credentials.github_api_key

まとめ

この記事では、OSの設定を管理し、APIキーを秘匿しておくのに役立つ便利なツール「環境変数」について学びました。

Rubyで環境変数を使う方法|ENVオブジェクトの操作から設定・Rails credentialsまで徹底解説

この記事が役に立ったら、ぜひ友人にもシェアしてください。より多くの人の目に届きます 🙂

最後までお読みいただきありがとうございました!


  1. RubyのStructとOpenStructの使い方を徹底解説!値オブジェクトを簡単に作る方法

    Rubyには、関連する属性をまとめて保持する「値オブジェクト」を手軽に作れるStructという組み込みクラスが用意されています。本記事では、Structの基本的な使い方から注意点、そしてOpenStructとの違いまで詳しく解説します。 そもそもStructとは何か? StructはRubyに組み込まれたクラスで、新しいクラスを動的に生成し、値オブジェクト(Value Object)を作成するために使われます。値オブジェクトとは、関連性のある複数の属性をひとまとめにして扱うためのオブジェクトです。 具体例を挙げてみましょう。 2つの座標(xとy)を持つPointというデータを表したい場合、この

  2. Windows 10 で環境変数を設定・編集する方法を初心者向けに解説

    環境変数とは、PC上で動作するプログラムの設定に使われるグローバルな値のことです。名前だけ聞くと難しく感じられますが、実際には「さまざまなアプリが共通して参照できる設定情報の保管場所」と考えると分かりやすいでしょう。 環境変数にはユーザーごとに紐づくものがあり、ユーザーアカウントが異なれば設定内容も変わります。その一方で、「%windir%」のようなシステム全体で共通の変数も存在します。たとえば「%windir%」は、Windowsがインストールされているディレクトリ(例:「C:\Windows」)を常に指します。アプリ側ではこの値を直接ハードコードせず、「%windir%」を参照することでW