大ちゃんの駆け出し技術ブログ

RUNTEQ受講生のかわいいといわれるアウトプットブログ

【Gem】dotenv

概要

今回はPFを作成するにあたり使用したgemであるdotenv-railsの紹介です。

github.com

用途としては以下のように説明されてます。


Storing configuration in the environment is one of the tenets of a twelve-factor app. Anything that is likely to change between deployment environments–such as resource handles for databases or credentials for external services–should be extracted from the code into environment variables. But it is not always practical to set environment variables on development machines or continuous integration servers where multiple projects are run. dotenv loads variables from a .env file into ENV when the environment is bootstrapped.

訳:

環境に設定を保存することは、アプリの12 原則の 1 つです。データベースのリソースハンドルや外部サービスの認証情報など、デプロイ環境によって変更される可能性があるものは、コードから環境変数に抽出する必要があります。

しかし、複数のプロジェクトを実行する開発マシンや継続的インテグレーションサーバに環境変数を設定することは、必ずしも現実的ではありません。 dotenvは、環境の起動時に.envファイルからENVに変数をロードします。


環境に設定を保存すること」とはどういうことでしょうか。後ろの文にある「データベースのリソースハンドルや外部サービスの認証情報など、デプロイ環境によって変更される可能性があるもの」から推測するに、環境によって異なる値となるものを保存することと解釈できます。これを環境変数というそうです。認証情報は確かに環境によって異なる値となります。

加えて、認証情報は公開せずに管理する必要があるため、手元で保存する必要があるのです。そのため、このような設定を実行する開発マシンやサーバなどに設定するのは難しいと言っています。

そこで環境の起動時に環境変数を定義している.envファイルから変数の読み込みを自動で行うためにこのgemを使います。

まとめると

三者に漏洩すると危険なパスワードや外部の認証情報を環境変数として管理

ちなみにアプリの12 原則についての公式サイトは以下になります。興味がある方は是非。

12factor.net

導入方法

いつも通りGemファイルに記載するだけですが、環境を指定してインストールを行うこともできます。

gem 'dotenv-rails', groups: [:環境名]

or

group :環境名 do 
  gem 'dotenv-rails'
end

例えば、開発環境でのみdotenv-railsを使用し、製品環境では別の方法で環境変数を管理する場合に上記のような指定が可能です。

今回は環境指定で開発環境とテスト環境にのみdotenv-railsを適用させましょう。

# Gemfile
group :development, :test do
  gem 'dotenv-rails'
bundle  install
Fetching dotenv 2.7.6
Installing dotenv 2.7.6
Fetching dotenv-rails 2.7.6
Installing dotenv-rails 2.7.6

次に、環境変数を定義する.envファイルをを作成します。.envファイルは手動で作成しないといけません。作成箇所はルートディレクトリ(Gemfileなどがおいてある最上階のディレクトリ)です。

$ touch .env

以上で導入は完了です。

.envファイルへの記述

.envファイルへの記載は公式では以下のように行っています。

S3_BUCKET=YOURS3BUCKET
SECRET_KEY=YOURSECRETKEYGOESHERE

右の値(YOURS3BUCKETYOURSECRETKEYGOESHERE)は環境変数をそのまま記載します。これが左の値(S3_BUCKETSECRET_KEY)に代入されます。左の値は自分で好きに定義できますが、他の値との見た目の差別化のためにすべて大文字にするようですね。

それでは仮になにかのキーの値を11111111111として.envファイルに保存します.

.env
SECRET_KEY=1111111111

使用例としてはdevise認証のためのAPIキーを入れておくなどがあるかなと思います。APIキーは正しく公開しない環境変数の一例ですよね。

記載の方法は以下のようになります。

ENV['.envファイルに記載した定数']
config.omniauth ENV['SECRET_KEY']

これで値の設定は完了です。アプリケーションが起動する時にこちらの値が読み込まれるようになります。