更新日:
【Rails】 dotenv-railsを使って環境変数を管理しよう
dotenv-railsとは、環境変数を管理する事が出来るgemです。アプリのプロジェクトルート配下に「環境変数を定義する.envファイル」を設置すると、自動で読み込まれます。
dotenv-rails
では、次のように.env
ファイルに環境変数を定義します。
1
SECRET_KEY = "test"
定義した環境変数は、次のように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します。
1
gem 'dotenv-rails'
1
bundle install
環境を指定する場合
環境を指定してdotenv-rails
をインストールしたい場合は、下記の様に記述します。
1
2
3
4
5
6
gem 'dotenv-rails', groups: [:環境名]
# gemが複数ある場合
group :環境名 do
gem 'dotenv-rails'
end
指定する環境のgemが複数ある場合は、上記の様にgroup
にブロックを渡してまとめる事が出来ます。
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
コマンドを使って手動でファイルを作成する必要があります。
1
$ touch .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
を定義します。
1
A=aaa
1
A=bbb
上記を各ファイルに定義して開発環境で動かした場合、下記の様に.env.local
ファイルで定義された環境変数A
が.env
ファイルで定義した環境変数A
よりも優先されます。
1
2
irb(main):001:0> ENV['A']
=> "bbb"
この様に設置する.env
ファイルは環境毎に分けて管理する事が出来ますが、同じ環境変数を定義する場合に優先順位を気をつけてください。
.envのテンプレートを用意したい場合
.env
ファイルのテンプレート用として.env.sample
ファイルを用意しておくと、他のメンバーがプロジェクトに参加した際に.env.sample
ファイルをコピーして.env
ファイルを作成出来るので便利です。
下記の様にcp
コマンドで.env.sample
ファイルをコピーして.env
ファイルを作成する事が出来ます。
1
cp .env.sample .env # cp [コピー元] [コピー先]
.env.sample
ファイルは、あくまでもテンプレート用ファイルなので本当のデータではなくダミーデータを入れます。
1
2
AWS_ACCESS_KEY_ID = 'IAMユーザー作成時のアクセスキーIDをここに記述'
AWS_SECRET_ACCESS_KEY = 'IAMユーザー作成時のシークレットアクセスキーをここに記述'
この状態で先ほどのコマンドを実行すると下記の様に.env.sample
ファイルをコピーして.envファイルが作成されます。
そして、.env
ファイルの方に環境変数の値を入れて第三者に漏洩しない為にGit管理下から除外します。(後述します。)
しかし、.env.sample
ファイルは.env
ファイルのテンプレートとして他の人も使う必要があるのでGit管理してGithubにアップロードします。
dotenv-railsの使い方
この章では、dotenv-rails
の使い方と各設定について解説します。
環境変数の定義と使い方
前章で設置した.env
ファイルに、環境変数を下記の様に定義する事でENV
に自動で設定されます。
1
2
# 環境変数名 = パスワードなど重要な情報
SECRET_KEY = YOURSECRETKEY
ファイルに定義した環境変数は、下記の様にENV['環境変数名']
で使う事が出来ます。
1
2
ENV['SECRET_KEY']
=> "YOURSECRETKEY"
環境変数とは?
環境変数とは、「全てのプログラムに共有して使うことが出来るWindows・MacOS・Linux
などの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
開いた時に実行する.zshrc
やbash_profile
や.bashrc
などに追加する必要があります。(この記事では割愛させて頂きます。)
しかし、上記ではアプリケーション開発する度に環境変数がローカル環境に増え続けてしますが、dotenv-rails
は.env
ファイルで環境変数を管理してくれるので、この点を解決してくれます。
環境変数の使用例
Railsアプリケーション開発で環境変数がよく使われるのは、画像ファイルのアップロード機能を簡単に追加するCarrierWaveを使って保存場所を外部のAmazon AWS S3にする場合です。
aws_access_key_id
やaws_secret_access_key
の様な外部に漏れたら悪用される情報は、必ず環境変数で定義してそれを参照する様にします。
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'
}•••
1
2
AWS_ACCESS_KEY_ID = 'AWSで作成したアクセスキー'
AWS_SECRET_ACCESS_KEY = 'AWSで作成したシークレットキー'
詳しくは、Carrierwaveチュートリアルを参照して下さい。
また、データベースのユーザー名やパスワードなど環境毎に異なる設定値も、環境変数を使う事で簡単に管理する事が出来ます。
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_USERNAME
とDB_PASSWORD
は、環境毎に設定値が異なるので、.env
ファイルではなく、下記の様にそれぞれ.env.環境名
のファイルを作成して定義します。
1
2
DB_USERNAME = '本番環境のユーザー名'
DB_PASSWORD = '本番環境のパスワード'
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の書き方」を参考にして下さい。)
1
2
3
4
5
/.env
# 環境毎のファイルがある場合
/.env.production
/.env.local・・・
今回は、環境変数を管理してくれるdotenv-rails
のgemを紹介しましたが、Rails5.2以降ではEncryptedCredentials
という重要な情報を暗号化してくれる機能があります。
Rails5.2以降の方はEncryptedCredentials
を利用して下さい。以下の参考書でもRailsにおける秘密情報の取り扱いについて詳細に解説しているので、ぜひ参考にしてください。
Rails 6.0も含めて広い範囲を体系的に学ぶことができます。
この記事のまとめ
dotenv-rails
とは、環境変数を管理する事が出来る便利なgemのこと- 環境変数とは、全てのプログラムに共有して使うことが出来るOSが提供する変数のこと
- 環境変数は、
.env
ファイルに定義してENV['環境変数名']
で参照する事が出来る .env
ファイルは、 Git管理下から除外する為に必ず.gitignore
ファイルに指定しよう