2018/09/15
Python デプロイ環境変数を理解しよう
この記事では、環境変数の概念とPython・Djangoでの扱い方についてまとめていきます。
まずは環境変数とはどんなもので、どういった場面で利用するものかを解説し、実際にPythonやDjangoを利用したプロジェクトでどのように活用するのかを具体例を用いて整理していきます。
環境変数とは?
それではまず、環境変数について説明していきます。
環境変数を一言で表すと、「各コンピュータ(OS)が個別に持っている変数」になります。例えば、みなさんが使っているパソコン(ローカル環境)の中にも環境変数を設定することができ、そのパソコン内で自由に利用できる変数になります。ちょっとわかりづらいと思うので、具体例を用いて解説します。
ターミナルを開いて、以下のコマンドを打ち込んでみてください。ディレクトリは基本的にどこでも大丈夫です。
環境変数の一覧を表示
$ printenv
$ set # windowsの場合
このようにすると、HOME=/Users/username
のような形式の変数リストが表示されます。これが、現在その環境(ローカル環境)に設定されている環境変数になります。
もう少し深掘りしてみます。今度は実際に自分で環境変数を設定してみましょう。環境変数を設定するコマンドは以下のようになります。
環境変数を設定
$ export test_var="this is test"
$ set TEST_VAR="this is test" # windowsの場合
このコマンドにより、test_var
という名前の環境変数にthis is test
という値が格納されたことになります。もう一度環境変数を確認してみましょう。
環境変数の一覧を表示
$ printenv
$ set # windowsの場合
test_var=this is test
という表示を確認することができましたか?環境変数がたくさんある時には、以下のように個別に値を取得することもできます。
特定の環境変数を確認
$ printenv test_var
this is test
export 環境変数名=値
という形式で設定した環境変数は、基本的にはセッション中しか保持されず、ターミナルを閉じると消えてしまいます。こちらを永続化させる方法は後ほど解説しますが、練習もかねてこちらの環境変数は、以下のコマンドで明示的に削除しておきましょう。
環境変数を削除
$ export -n test_var
どのような時に環境変数を利用するのか?
具体的な利用方法を解説する前に、どのような場合に環境変数を利用するのかを説明します。
環境変数は主に、環境によって値の異なる変数が必要なときに使います。例えば、ローカル環境用のデータベースと本番環境用のデータベースへのパスは基本的には異なることが想定されますが、Djangoのプロジェクト内でそれらをいちいちif文などで切り替えたりするのは面倒です。そのため、DJANGO_DB
のような環境変数をローカル環境と本番環境それぞれで設定しておいて、プロジェクトのコード内ではDJANGO_DB
という変数を参照するといったことが考えられます。
他にも、AWSなどのアクセスキーやシークレットキーなどの他人に公開したくない変数などは、コード内に直接書き込むのではなく、環境ごとの環境変数を読み込んで利用するなどは良く行われます。
それではPythonとDjangoでの具体的な利用例を見ていきましょう。
Python・Djangoで環境変数を利用する
Pythonではosモジュールで環境変数を扱うことができます。以下のコードをみてください。
環境変数の一覧を表示
>>> import os
>>> print(os.environ) # 環境変数の辞書型を取得する
>>> db = os.environ.get('DJANGO_DB') # DJANGO_DBという環境変数を取得する
>>> a = os.environ.get('NOT_EXISTS_ENVIRON') # 存在しない環境変数名を指定するとNoneが返される
ここでは、dbという変数にDJANGO_DBという環境変数を格納しています。また、もし存在していない環境変数を取得しようとすると、Noneが格納されます。
Djangoのプロジェクトでの具体的な利用方法もみてみましょう。先ほども少し説明しましたが、Djangoプロジェクトのシークレットキーのような、他の人には秘密にしておきたい値を環境変数にしてみます。
今回は簡単に、Djangoプロジェクトのデフォルトのシークレットキーを変更してみます。Djangoプロジェクトのsettings.pyには、以下のようにシークレットキーがハードコードィングされています。こちらはセキュリティ上、デフォルトの値から変更した上で、gitなどの履歴に残さないように環境変数で管理するべきです。django_projectという名前のプロジェクトを作っていると仮定してみていきましょう。
django_project/django_project/settings.py
SECRET_KEY = '#!$@h!z9gvpwe8rsjshfsojdnlc(ogy$%u93epm5hij!=n=j!#)5jt&v47_' # これを変更する
これを環境変数で取得できるようにします。
django_project/django_project/settings.py
import os
...
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY') # 環境変数でシークレットキーを取得
これにより、ローカル環境でも、本番環境でも、DJANGO_SECRET_KEYという環境変数をもとにシークレットキーを参照することになります。コード内にシークレットキーを書き込んで管理する必要もなくなり、環境ごとに別の値を設定することもできるようになりました。
本番環境での環境変数の設定方法はそれぞれのサービスによって異なるため、説明は省きますが、ローカル環境での環境変数の設定方法は以下のようになります。(それぞれのサービスで「環境変数 設定」のようにググればすぐに見つかるはずです)
~/.bashrc
...
export DJANGO_SECRET_KEY="#!$@h!z9gvpwe8rsjshfsojdnlc(ogy$%u93epm5hij!=n=j!#)5jt&v47_" # 末尾に追加
.bashrcファイルでは、上記のような記述をすることで、ターミナルのセッションごとに環境変数を設定することができます。(つまり永続化できます)
また、.bashrcを変更した後には、それを反映させるために以下のコマンドが必要になるので、忘れずに実行してください。
~/
$ source ~/.bashrc
今回は簡単でしたが、実際のDjangoプロジェクト開発時に重要な要素となる環境変数の基礎について扱いました。チュートリアルなどでより実践的な設定の方法なども扱っていくので、まずは基本的な概念を理解しておきましょう。