Djangoとherokuで動かしているWebアプリケーションで環境変数を設定してみたけど意味あるの?とか環境変数ファイルを作成して、.gitignoreに入れたらHeroku上で反映されない!みたいなことがあると思います。

今回はDjangoとherokuのWebアプリに環境変数を設定する方法を一から解説致します。

💁‍♀️

環境変数の設定はdjango-environを使うよ





なぜ環境変数を使うのか?

作業に入る前に簡単に環境変数を使うメリットについてお話致します。

まず、環境変数とはos上で定義されている変数のことで、変数名と値がペアになっています。
この環境変数は同じos内で動いているプログラムであれば参照することができます。
ここではDjangoアプリの外部で定義されている変数だと思ってください。

環境変数のメリットの一つとして、ファィルを更新する際に一々コードを修正しなくてよくなります。
settings.pyのDEBUGなど本番環境とテスト環境で設定が違う部分に環境変数が利用できます。
(私はつい最近までDEBUGを手動で書き換えていました笑)

ローカル環境と本番環境の変数使用例

ちなみにローカル環境で環境変数を設定したのがHeroku側で反映されない!みたいな質問をよく見ます。
環境変数はosごとに存在するので、ローカル環境で定義された 環境変数はherokuの環境では使用することはできません。
つまり環境変数はローカル環境とheroku環境で設定しなければいけません。

ローカル環境と本番環境の構成図

もう一つ大きなメリットとしてあまり人に見せたくない情報に環境変数を利用することもできます。 herokuにファイルをアップするときにgithubのレポジトリを経由しますよね。
もし環境変数を使わない場合、settings.pyにベタ書きしているAPIキーなどの秘密情報もレポジトリに上がってしまいます。

ローカル環境とGitHubとHeroku

この状態で誤ってレポジトリが公開されてしまうとAPIキーが漏洩してしまうリスクがあります。
レポジトリに秘密情報を上げなくていいようにするために環境変数が利用できます。

ローカル環境とGitHubとHeroku

以上が環境変数の主なメリットです。
メリットが何となくわかったところで作業に入りたいと思います。

django-environをインストール

ローカル環境で環境変数を使うと後々の管理も大変になってくるので、
今回はdjango-environを使って、環境変数設定ファイルを作成してそこに変数を設定します。

project
├── app
├── manage.py
├── .env ←環境変数設定ファイル
└── project
          └── settings.py

まずはdjango-environをインストールします。

$ pip install django-environ

requirements.txtに出力
$ pip freeze > requirements.txt

環境変数設定ファイルの作成

Djangoのプロジェクト配下(manage.pyと同じ階層)に.envファイルを作成
作成したファイルに変数を記述
(今回はDEBUGとSECRET_KEYを設定してみます。)

.env
DEBUG=TRUE
SECRET_KEY=xxx # settings.pyからコピーして代入

settings.pyの変更

environをインポートして読み込む

settings.py
import environ
...
env = environ.Env()  

デフォルトではosの環境変数を呼び出すので、 ローカルでは.envファイルを読むように設定します。
env.boolは第一引数で指定した変数が設定されていなければ、Falseを返すようになっています。 Herokuの環境変数にDJANGO_HEROKU_ENV=TRUEを追加します。 (後で追加します)

settings.py
# herokuの環境かどうか
HEROKU_ENV = env.bool('DJANGO_HEROKU_ENV', default=False)
# herokuの環境でない時は.envファイルを読む if not HEROKU_ENV: env.read_env('.env')

DEBUGとSECRET_KEYを変更

settings.py
DEBUG=env.bool('DEBUG', False)
...
SECRET_KEY=env("SECRET_KEY")

.envをpush対象から除外

.envファイルをGitHubのレポジトリへのpush対象から外します。

manage.pyと同じディレクトリにある.gitignoreに.envを追加

.gitignore
...
.env

Herokuの環境変数設定

herokuの環境変数を追加していきます。

$ heroku config:set DEBUG=False
$ heroku config:set SECRET_KEY=xxx
$ heroku config:set DJANGO_HEROKU_ENV=True

ちなみに一括で追加できる方法もあるのでたくさんある場合は調べてみて活用してください。
ちゃんと追加されたかどうかは以下のコマンドで確認できます。
$ heroku config

お疲れ様でした。
作業は以上となります!

Push!

最後にファイルを更新して確認してみましょう!

$ git add .
$ git commit -m "test"
$ git push heroku master

今回はenvとenv.boolのみ説明しましたが、DB用のenv.db()なんかもあったりします。
環境変数の設定に慣れてきたら使ってみてください。

参考サイト

Djangoでの環境変数と、Angularを用いたフロントエンドの実装
Django-environ

まとめ

環境変数をどうして設定するのかとDjangoアプリをHerokuにデプロイする際の設定方法が理解していただけたら嬉しいです! はぜひ環境変数を設定してみてください。