この記事について
Djangoで本番運用やチーム開発を行うに当たって、プロジェクトの初期構成にどのように手を入れたらよいかを、The Twelve Factorsなどを参考にまとめたメモです。
認証情報を環境変数に格納する目的
Twelve Factor Ⅲ.設定の推奨に合わせて、設定ファイル上のデータベース(DATABASES)やストレージ(MEDIA_URL)への接続設定を外部より取得するように変更します。
メリット
設定項目の存在は公表しつつ具体的な設定内容を隠匿できる(オープンソース化)
Githubリポジトリに接続設定を入れてしまって他人に悪用される事故を防げる(要
.gitignore
)。-
一部のクラウドサービスには環境変数をコマンドラインやWEB UIより設定できる機能があり、これを利用した動的な設定が可能になる。
例:
参考:日経xTech Twelve-Factor App(6)環境の違いを設定で吸収
変更方針
本番環境では環境変数を使うとして、開発環境でいちいち環境変数を設定するのは手間です。パッケージ「django-environ」を使うと、開発環境ではテキストファイル「.env」より取得した値を使うことができます。
参考:
作業手順
開発と本番の設定ファイルを分離済みであるという前提とします。
[開発環境]
手順1
プロジェクトにパッケージ django-environをインストールします。
pip install django-environ
手順2
プロジェクトルートに「.env」というテキストファイルを作成し、必要な接続設定等を入力します。データベースの接続設定はdj-database-urlの記法を使います。
DEBUG=True
# Postgres
DATABASE_URL=postgres://USER:PASSWORD@HOST:PORT/DBNAME
手順3
開発用設定ファイルproject/settings/local.py
の接続設定を、django-environを利用した設定に変更します。
import environ
root = environ.Path(__file__) - 3 #
env_file = str(root.path('.env'))
env = environ.Env()
env.read_env(env_file)
DEBUG = env('DEBUG')
DATABASES = {
'default': env.db()
}
[本番環境]
手順4
開発環境と同様に本番環境の設定ファイルconfig/settings/production.py
も変更します。こちらに「.env」の読込設定は不要です。
import environ
env = environ.Env()
DATABASES = {
'default': env.db()
}
AWS_ACCESS_KEY_ID = env('DJANGO_AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = env('DJANGO_AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = env('DJANGO_AWS_STORAGE_BUCKET_NAME')
手順5
本番環境の環境変数を以下のいずれかの方法で設定します
OSの設定を使う(
/etc/environment
、/etc/profile
)Webサーバの設定を使う(
httpd.conf
、Web.Config
)クラウドサービスの機能を使う(コマンドライン、Web UI)
[Dockerの場合] 環境設定オプションを使う(
--env-file .env
)