システム開発において、公開したくないデータを環境変数として保持しておきプログラムから参照する方法は、実務でよく利用されるプログラマーなら覚えておきたい知識の1つです。
本記事では、プログラミング言語Rubyで環境変数から値を取得するENVオブジェクトの利用方法をご紹介していきます。
目次
そもそも環境変数って何?
環境変数は、オペレーティング・システムが提供するデータ共有機能です。
公開したくないデータを環境変数として定義しておき、プログラムからデータを参照することで必要に応じて利用することが可能となります。
利用用途
例えば、ログイン用のパスワードなどの情報をプログラムで利用する際、ソースコードに直接記述してしまうと、ソースコードを参照出来る人が全員パスワードを知ることが出来てしまうのはもちろん、GitHubなどでパスワード自体を公開してしまう可能性も否定出来ません。
このようなセキュリティリスクを避けるために、あくまで実際のパスワードはローカルコンピューター上に保持しておき、必要に応じてプログラム上から実際の値を取得するような実装で利用されます。
環境変数の設定方法
環境変数は「~/.bash_profile」や「~/.bashrc」の設定ファイルに記述されます。
「~/.bash_profile」はログイン時のみ設定されるファイルで、「~/.bashrc」はbashを起動するたびに毎回設定されるファイルです。
処理の順番としては「~/.bash_profile」が読み込まれた後、「~/.bashrc」を読み込む形となります。
OSを再起動した際には両方のファイルが再読み込みされますが、bashを再起動した際には、「~/.bash_profile」の再読み込みは行われません。
環境変数をどちらのファイルに記述しなければいけないといった決まりはなく、どちらかに設定しておけば利用可能です。
RubyのENVオブジェクトで環境変数を読み込む
ではRubyで設定した環境変数を読み込むにはどうすれば良いのかというと、ENVオブジェクトを利用して値を取得します。
基本構文
記述方法は簡単で下記の形式で取得出来ます。
ENV["キー名"]
例えば「SAMPLE」という環境変数の値を取得したい場合には、下記のように記述します。
ENV["SAMPLE"]
.bash_profileから読み込む
サンプルとして「~/.bash_profile」に「SAMPLE」という変数を定義してRubyプログラムから取得してみましょう。
bash_profileに下記の文言を記述しておきます。
.bash_profile
export SAMPLE="test"
次に「sample.rb」というファイルを作成し、下記のコマンドを記述しました。
sample.rb
puts ENV["SAMPLE"]
ターミナルからRubyのコマンドを実行して取得出来るか確認してみましょう。
ruby_sample $ ruby sample.rb test
環境変数として指定した値が取得出来ていることをご確認頂けます。
.bashrcから読み込む
今度は「~/.bashrc」に記述した環境変数をENVオブジェクトで取得出来るのか確認してみましょう。
.bashrcに下記の文言を記述しておきます。
export SAMPLE_BASHRC="bashrc"
sample.rbファイルは取得したい環境変数に修正しておきます。
sample.rb
puts ENV["SAMPLE_BASHRC"]
ターミナルからrubyのコードを実行してみましょう。
ruby_sample $ ruby sample.rb bashrc
このように「.bashrc」ファイルからも環境変数として設定した値を取得出来ていることが確認出来ました。
RubyではENVのfetchメソッドでも環境変数が読み込める
RubyのENVオブジェクトの利用方法を上述してきましたが、ENVオブジェクトではfetchメソッドを利用して環境変数の値を読み込む方法も利用可能です。
基本構文
fetchメソッドを利用した場合、下記のように記述して環境変数を取得します。
ENV.fetch("キー名"){"デフォルト値"}
デフォルト値の項目が追加されており、指定したキー名が存在しなかった場合に、返却する値を設定することが出来ます。
例えば、「SAMPLE」というキー名が存在しなかった場合に「SAMPLEは存在しませんでした。」という文言を返却するのであれば下記のような記述となります。
ENV.fetch("SAMPLE"){"SAMPLEは存在しませんでした。"}
fetchを使用する場合、キー名の指定方法が[]から()に変わるため注意が必要です。
環境変数に存在する値を取得するサンプル
まずは上記のENVオブジェクトサンプルで利用した環境変数をそのままfetchメソッドで取得してみましょう。
sample.rb
puts ENV.fetch("SAMPLE"){"SAMPLEの環境変数は存在しませんでした。"} puts ENV.fetch("SAMPLE_BASHRC"){"SAMPLE_BASHRCの環境変数は存在しませんでした。"}
ターミナルからコードを実行してみます。
ruby_sample $ ruby sample.rb test bashrc
環境変数に設定した値が取得出来ていることをご確認頂けます。
環境変数に存在しない値を指定したサンプル
続いて環境変数に存在しない値を指定した場合の挙動を確認してみましょう。
sample.rbのコードを下記のように修正します。
sample.rb
puts ENV["SAMPLE_TEST1"] puts ENV.fetch("SAMPLE_TEST1"){"SAMPLE_TEST1の環境変数は存在しませんでした。"} puts ENV.fetch("SAMPLE_TEST2"){"SAMPLE_TEST2Cの環境変数は存在しませんでした。"}
ターミナルからコードを実行してみます。
ruby_sample $ ruby sample.rb SAMPLE_TEST1の環境変数は存在しませんでした。 SAMPLE_TEST2Cの環境変数は存在しませんでした。
実行結果を確認していただくと、1行目は空白行として処理されており、2行目以降のfetchメソッドを利用した環境変数の取得では、デフォルト値に指定した値が表示されています。
ENV[“キー名”]の指定で環境変数を取得しようとした際、キーが存在しない場合には「nil」が返却されるため、何も表示されません。
一方で、fetchメソッドを利用して取得する場合、デフォルト値を指定出来ることから、指定したキーの環境変数が取得出来なかった場合には任意の値を返却することが可能となり、このような結果の違いが生まれています。。
さいごに: ENVオブジェクトを利用した環境変数の取得処理はRubyプログラム開発の必須知識
本記事では、 RubyのENVオブジェクトを使用して、プログラムから環境変数に設定された値を取得する方法についてご紹介してきました。
環境変数を利用して、パスワードなどの重要な情報をコンピューター上に保持し、プログラム上から取得するという処理は実務ではよく利用される方法です。
今回ご紹介したRubyでの環境変数取得方法を把握するのはもちろん、他のプログラミング言語でも環境変数を利用したデータ保持の考え方は同じですので、きちんと仕組み自体を理解してRuby以外のプログラム開発でも対応出来るように学習しておきましょう。
この説明はMac環境のユーザーを想定しています。