すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Rails

【Rails】 dotenv-railsを使って環境変数を管理しよう

ぴっかちゃん
ぴっかちゃん

dotenv-railsとは、環境変数を管理する事が出来るgemです。アプリのプロジェクトルート配下に「環境変数を定義する.envファイル」を設置すると、自動で読み込まれます。

dotenv-railsでは、次のように.envファイルに環境変数を定義します。

.env | 環境変数の定義
1
SECRET_KEY = "test"

定義した環境変数は、次のようにENV['環境変数名']で呼び出すことができます。

コンソール | .envで定義した環境変数の使い方
1
2
irb(main):001:0> ENV['SECRET_KEY']
=> "test"

Githubなどにアップロードすべきでない第三者に漏洩すると危険なパスワードや外部のAPIキーの情報を環境変数として管理します。

dotenv-railsの導入方法

この章では、Railsアプリケーションにdotenv-railsをインストールする方法と環境変数のファイルの設置方法を解説します。

dotenv-railsをインストール

まずは、dotenv-railsをインストールする為に、Gemfileに下記を追加してbundle installします。

Gemfile | dotenv-railsをGemfileに追加
1
gem 'dotenv-rails'
コンソール | dotenv-railsをインストール
1
bundle install

環境を指定する場合

環境を指定してdotenv-railsをインストールしたい場合は、下記の様に記述します。

Gemfile | 環境を指定する場合
1
2
3
4
5
6
gem 'dotenv-rails', groups: [:環境名]

# gemが複数ある場合
group :環境名 do 
    gem 'dotenv-rails'
end

指定する環境のgemが複数ある場合は、上記の様にgroupにブロックを渡してまとめる事が出来ます。

Gemfile | テスト環境と開発環境を指定してインストールする
1
2
3
4
5
gem 'dotenv-rails', groups: [:development, :test]

group :development, :test do # 上記と同等
    gem 'dotenv-rails', groups: [:development, :test]
end

上記の様に指定をすると、開発環境とテスト環境でdotenv-railsをインストールする事が出来ます。

.envファイルの設置

次に、環境変数を定義する.envファイルをアプリのプロジェクトルート配下に設置します。
.envファイルは自動生成されない為、下記の様にtouchコマンドを使って手動でファイルを作成する必要があります。

コンソール | .envファイル作成
1
$ touch .env 

下記の様に、アプリケーションのルート直下に.envファイルを設置出来たら導入は完了です。

アプリケーションにenvファイル追加

touchコマンドは、.envファイルをルート直下に作成する必要があるのでアプリケーションのディレクトリで実行しましょう。

環境毎に環境変数を変えたい場合

環境変数を開発環境テスト環境など環境毎に変えて管理したい場合は、ルート直下に.env.環境名のファイルを設置します。

ファイル名 環境 優先順位
.env 全ての環境
.env.development 開発環境
.env.test テスト環境
.env.production 本番環境
.env.local テスト環境以外
.env.local.development 開発環境 最高
.env.local.test テスト環境 最高
.env.local.production 本番環境 最高

同じ環境変数を環境が一致するファイルに定義した場合、優先順位が高い環境変数が適用されます。

使い方の章で詳しく解説しますが、例えば下記の様に.envファイルと.env.localに環境変数Aを定義します。

.env | 環境変数Aを定義
1
A=aaa
.env.local | 環境変数Aを定義
1
A=bbb

上記を各ファイルに定義して開発環境で動かした場合、下記の様に.env.localファイルで定義された環境変数A.envファイルで定義した環境変数Aよりも優先されます。

コンソール | 開発環境のコンソールで環境変数Aを確認する
1
2
irb(main):001:0> ENV['A']
=> "bbb"

この様に設置する.envファイルは環境毎に分けて管理する事が出来ますが、同じ環境変数を定義する場合に優先順位を気をつけてください。

.envのテンプレートを用意したい場合

.envファイルのテンプレート用として.env.sampleファイルを用意しておくと、他のメンバーがプロジェクトに参加した際に.env.sampleファイルをコピーして.envファイルを作成出来るので便利です。

下記の様にcpコマンドで.env.sampleファイルをコピーして.envファイルを作成する事が出来ます。

コンソール | .env.sampleファイルをコピーして.envファイルを作成する
1
cp .env.sample .env # cp [コピー元] [コピー先]

.env.sampleファイルは、あくまでもテンプレート用ファイルなので本当のデータではなくダミーデータを入れます。

.env.sample | テンプレート用ファイル
1
2
AWS_ACCESS_KEY_ID = 'IAMユーザー作成時のアクセスキーIDをここに記述'
AWS_SECRET_ACCESS_KEY = 'IAMユーザー作成時のシークレットアクセスキーをここに記述'

この状態で先ほどのコマンドを実行すると下記の様に.env.sampleファイルをコピーして.envファイルが作成されます。

.envファイルを作成

そして、.envファイルの方に環境変数の値を入れて第三者に漏洩しない為にGit管理下から除外します。(後述します。)

しかし、.env.sampleファイルは.envファイルのテンプレートとして他の人も使う必要があるのでGit管理してGithubにアップロードします。

dotenv-railsの使い方

この章では、dotenv-railsの使い方と各設定について解説します。

環境変数の定義と使い方

前章で設置した.envファイルに、環境変数を下記の様に定義する事でENVに自動で設定されます。

.env | 環境変数を定義する-->
1
2
# 環境変数名 = パスワードなど重要な情報  
SECRET_KEY = YOURSECRETKEY

ファイルに定義した環境変数は、下記の様にENV['環境変数名']で使う事が出来ます。

コンソール | .envに定義した環境変数を使う
1
2
ENV['SECRET_KEY']
=> "YOURSECRETKEY"

環境変数とは?

環境変数とは、「全てのプログラムに共有して使うことが出来るWindows・MacOS・LinuxなどのOSが提供する変数のこと」です。

環境変数とOS

OSとは、オペレーティングシステムの略でパソコンやスマートフォンを動かすための基本ソフトウェアです。パソコンでは、Windows・MacOS・LinuxのOSが代表的です。

環境変数は、主にOSの環境をカスタマイズする時や環境によって異なる値を設定したい時、 重要な情報をコード内に記述したくない時に使われます。

パソコン内の環境変数は、ターミナルを開いてprintenvを実行すると全て表示されます。

コンソール | パソコン内の環境変数を表示させる-->
1
2
3
4
5
6
7
8
9
10
$ printenv

LOGNAME=×××× # パソコン内に設定してある環境変数一覧
XPC_SERVICE_NAME=××××
COMMAND_MODE=unix2003
USER=pikako
XPC_FLAGS=×××××
TERM_PROGRAM=××××××
TERM=xterm-256color
HISTSIZE=2000・・・・

これらの環境変数はecho $環境変数名でどこからでも参照する事が出来ます。また、新たに環境変数をexport 環境変数名 = 値で追加する事も出来ます。

コンソール | 環境変数の参照と追加
1
2
3
4
5
6
echo $USER # 環境変数の参照
pikako

export ENV_TEST="pikapika" # 環境変数の追加
echo $ENV_TEST # 設定を確認
pikapika

上記で追加した環境変数はTerminalを閉じると消えてしまうので、実際にはTerminal開いた時に実行する.zshrcbash_profile.bashrcなどに追加する必要があります。(この記事では割愛させて頂きます。)

しかし、上記ではアプリケーション開発する度に環境変数がローカル環境に増え続けてしますが、dotenv-rails.envファイルで環境変数を管理してくれるので、この点を解決してくれます。

環境変数の使用例

Railsアプリケーション開発で環境変数がよく使われるのは、画像ファイルのアップロード機能を簡単に追加するCarrierWaveを使って保存場所を外部のAmazon AWS S3にする場合です。

aws_access_key_idaws_secret_access_keyの様な外部に漏れたら悪用される情報は、必ず環境変数で定義してそれを参照する様にします。

config/initializers/carrierwave.rb | s3設定一部例-->
1
2
3
4
5
6
•••config.fog_credentials = {
        provider: 'AWS',
        aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'], # 環境変数を参照
        aws_secret_access_key:  ENV['AWS_SECRET_ACCESS_KEY'], # 環境変数を参照
        region: 'ap-northeast-1'
    }•••
.env | s3に必要な環境変数の設定
1
2
AWS_ACCESS_KEY_ID = 'AWSで作成したアクセスキー'
AWS_SECRET_ACCESS_KEY = 'AWSで作成したシークレットキー' 

詳しくは、Carrierwaveチュートリアルを参照して下さい。

また、データベースのユーザー名やパスワードなど環境毎に異なる設定値も、環境変数を使う事で簡単に管理する事が出来ます。

database.yml | データベースのユーザー名やパスワードに環境変数を使用する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  socket: /tmp/mysql.sock

development:
  <<: *default
  database: dotenv_development
  username: <%= ENV['DB_USERNAME'] %> # 開発環境の環境変数を参照
  password: <%= ENV['DB_PASSWORD'] %> # 開発環境の環境変数を参照

production:
  <<: *default
  database: dotenv_production
  username: <%= ENV['DB_USERNAME'] %> # 本番環境の環境変数を参照
  password: <%= ENV['DB_PASSWORD'] %> # 本番環境の環境変数を参照

DB_USERNAMEDB_PASSWORDは、環境毎に設定値が異なるので、.envファイルではなく、下記の様にそれぞれ.env.環境名のファイルを作成して定義します。

.env.production | 本番環境用の環境変数を設定
1
2
DB_USERNAME = '本番環境のユーザー名'
DB_PASSWORD = '本番環境のパスワード'
.env.development | 開発環境用の環境変数を設定
1
2
DB_USERNAME =  '開発環境のユーザー名'
DB_PASSWORD = '開発環境のパスワード'

開発環境と本番環境のコンソールで上記の環境変数をそれぞれ確認すると、下記の結果になります。

コンソール | 開発環境で環境変数を確認する
1
2
3
4
5
6
7
8
rails c # 開発環境のコンソール起動
Loading development environment (Rails 5.2.4.1)

irb(main):001:0> ENV['DB_USERNAME']
=> "開発環境のユーザー名"

irb(main):002:0> ENV['DB_PASSWORD']
=> "開発環境のパスワード"
コンソール | 本番環境で環境変数を確認する
1
2
3
4
5
6
7
8
 rails c production # 本番環境のコンソール起動
Loading production environment (Rails 5.2.4.1)

irb(main):001:0> ENV['DB_USERNAME']
=> "本番環境のユーザー名"

irb(main):002:0> ENV['DB_PASSWORD']
=> "本番環境のパスワード"

このように環境毎に異なる設定値も、環境変数を使う事で簡単に管理する事が出来ます。

各環境毎のコンソール起動は、コンソール起動を環境毎に変更する場合を参照して下さい。

Git管理下から必ず除外する

.envファイルで定義した環境変数には、第三者に漏洩したくない重要な情報を記述します。
その為、Githubに間違ってもアップロードしてはいけません。

.envファイルは、Git管理下から除外する為に必ずgitignoreファイルに指定する必要があります。(gitignoreについては、「.gitignoreの書き方」を参考にして下さい。)

.gitignore | .envファイルをGit管理下から除外する
1
2
3
4
5
/.env

# 環境毎のファイルがある場合
/.env.production
/.env.local・・・

今回は、環境変数を管理してくれるdotenv-railsのgemを紹介しましたが、Rails5.2以降ではEncryptedCredentialsという重要な情報を暗号化してくれる機能があります。

Rails5.2以降の方はEncryptedCredentialsを利用して下さい。以下の参考書でもRailsにおける秘密情報の取り扱いについて詳細に解説しているので、ぜひ参考にしてください。

Rails参考書
パーフェクト Ruby on Rails【増補改訂版】

Rails 6.0も含めて広い範囲を体系的に学ぶことができます。

この記事のまとめ

  • dotenv-railsとは、環境変数を管理する事が出来る便利なgemのこと
  • 環境変数とは、全てのプログラムに共有して使うことが出来るOSが提供する変数のこと
  • 環境変数は、.envファイルに定義してENV['環境変数名']で参照する事が出来る
  • .envファイルは、 Git管理下から除外する為に必ず.gitignoreファイルに指定しよう