はじめに
これまでQiitaは眺めるだけで記事を書くことをしてきませんでしたが、備忘録のため、そして自分の認識が間違っていた場合に集合知によって殴られるため(?)、一念発起して記事を書いてみることにしました。願わくば同じような課題に突き当たっている方の助けとなりますように。
Django備忘録シリーズと称して今回は、SECRET_KEYをはじめとするGitにはちょっとcommitしづらい機密情報を別ファイルで管理する方法を書いていきます。
ここで紹介する実装はGithubで公開しています。以下、ディレクトリ構成は公開しているリポジトリに準拠するものとします。
機密情報とは
本記事で触れているDjangoプロジェクトに限らず、一般的なプロジェクトには多かれ少なかれ機密情報が含まれていることが多いと思います。
Djangoプロジェクトの場合、大体以下の情報が機密情報となることが多いのではないでしょうか?
- SECRET_KEY
- データベースのホスト名、ユーザ名、パスワード等
- 外部サービスのAPIキー等
これらの情報をうっかりGitHub等で公開してしまうと、不正アクセスによる情報漏洩の原因となったり、契約している外部サービスを勝手に第三者に使われて、課金額が恐ろしいことになったりします。
またこれらの情報は、開発環境、ステージング環境、本番環境でそれぞれ別の値としたいケースも多いです。(例:決済サービスStripeのテストキーと本番キー)
こういった機密情報をDjangoプロジェクトの実装から切り離して別ファイルで管理し、環境ごとの値の切り替えを簡単に実現してくれるのがdjango-environです。
django-environを使ってみる
Djangoプロジェクトの作成方法については、先人の知恵が調べればたくさん出てくるので、一旦割愛します。筆が乗ればいずれ自分でも書きます。
まずはインストールしないと始まらないので、pipでサクッと入れてしまいましょう。
pip3 install django-environ
インストールできたら、次はsettings.pyに含まれている機密情報を別ファイルに書き出していきます。
プロジェクトのルート直下(sample_project/)に.envというファイルを作成しましょう。
説明の都合上.envもGitHubに公開していますが、実際には絶対に公開してはいけません。.gitignoreに忘れずに追記しておきましょう。.envは絶対に公開してはいけません。
.envの中身は、例えばこんな感じです。
DEBUG=on
SECRET_KEY=django-insecure-_fm3))r6!#)^wxpv2r1*&gzj=wnhis!nb-u26fjlphj$e(a(%4
ALLOWED_HOSTS=localhost
別ファイルで管理したい機密情報を.envに書き出したら、最後にsettings.pyを編集します。
django-environをインポートして、settings.pyに記述されている各種機密情報を.envを参照した値に置き換えましょう。
# django-environを用いた環境変数の秘匿サンプル
# django-environをインポート
import os
import environ
from pathlib import Path
# envオブジェクトを作成
env = environ.Env(
DEBUG = (bool, False)
)
# sample_project/.envを読み込み
# CAUTION: sample_project/.envは、実際のプロジェクトではGit管理内容に含めない!
BASE_DIR = Path(__file__).resolve().parent.parent
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))
# 読み込んだ環境変数を設定
SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
ALLOWED_HOSTS = env.list('ALLOWED_HOSTS')
サーバを起動してみて、正しく起動すれば設定は完了です。おめでとうございます!
環境ごとに設定値を切り替える
.envの内容を、環境ごとに変更しておくだけです。Git管理から外しているので、pullしても.envの内容は上書きされません。やったね!
結論
- 機密情報はGitに公開してはいけない
- 機密情報はGitに公開してはいけない
- 機密情報はGitに公開してはいけない
- 機密情報はGitに公開してはいけない
- 機密情報はGitに公開してはいけない
- 機密情報はGitに公開してはいけない