【Python】APIキーどうしてる?.envを使って環境変数を安全に管理する方法
はじめに
この記事は,筆者にとってのQiita初投稿である.
Pythonで開発をしていると,APIキーやデータベースの接続情報など,ソースコードに直接書きたくない(書くべきではない)情報が頻繁に登場する.
「テスト中はベタ書きしてたけど,これってGitHubに上げちゃって大丈夫だっけ...?」
「他の人にコードを渡すとき,設定箇所を毎回説明するのが面倒...」
本稿では,このような悩みを解決するため,.env
ファイルとpython-decouple
ライブラリを使って,秘匿情報を安全かつスマートに管理する方法を解説する.
本稿の目的
- 環境変数をプロジェクト内で安全に扱う方法を解説すること.
- (個人的な目的として)Qiitaへの技術記事投稿に挑戦すること.
そもそも環境変数とは?
環境変数とは,**「プログラムの外部で設定し,コードの中から参照できる値」**のことである.
APIキーやパスワードといった秘匿すべき情報をソースコード内に直接記述する代わりに,外部のファイルやOSに設定を保存するために使われる.
なぜ必要か?
-
セキュリティの向上: ソースコードをGitHubなどの公開リポジトリで管理する場合,
APIキー
などがハードコーディングされていると,第三者に不正利用される危険性がある. - 設定の分離: 開発環境と本番環境でデータベースの接続先が違うといったケースでも,コードを書き換えることなく設定を切り替えられる.
python-decouple
を使った安全な管理方法
ここでは,Pythonで開発を行う場合を想定し,具体的な手順を解説する.
STEP 1: ライブラリのインストール
まず,環境変数を読み込むためのライブラリpython-decouple
をインストールする.
pip install python-decouple
STEP 2: .env
ファイルに環境変数を定義
次に,プロジェクトのルートディレクトリに.env
というファイルを作成し,環境変数をキー=値
の形式で記述する.
# APIキー
XX_API_KEY=09abcdefg12345
YY_API_KEY=m*hijklmn67890
# アプリ設定
DEBUG=True
TIMEOUT_SEC=15
BASE_URL=[https://api.example.com](https://api.example.com)
⚠️このファイルには実際の値を記述するため,Gitなどで公開してはならない.
STEP 3: .gitignore
に.env
を追加【最重要】
作成した.env
ファイルがGitの管理対象に含まれないようにする.これはセキュリティ上,極めて重要な手順である.
.gitignore
ファイルに.env
を必ず追記すること.
これにより,誤ってGitHubに機密情報をプッシュしてしまう事故を防げる.
# 環境変数ファイル
.env
# (その他,venvや__pycache__など)
venv/
__pycache__/
*.pyc
もし.gitignore
ファイルがなければ,新しく作成すること.
STEP 4: Pythonコードで環境変数を読み込む
準備が整ったため,Pythonコードから環境変数を読み込む.
decouple
ライブラリのconfig()
関数を使用する.
from decouple import config
# .envファイルから環境変数を読み込む
# 必須のキー(.envに定義がないとエラーとなる)
XX_API_KEY = config("XX_API_KEY")
# デフォルト値や型変換も可能
# DEBUGキーが未設定ならFalseを使い,型はbool型に変換する
DEBUG = config("DEBUG", default=False, cast=bool)
TIMEOUT_SEC = config("TIMEOUT_SEC", default=30, cast=int)
BASE_URL = config("BASE_URL", default="[https://api.default.com](https://api.default.com)")
# --- 動作確認 ---
if __name__ == "__main__":
# 実際のAPIキーは表示しないように注意すること
print(f"XX_API_KEY is loaded: {'*' * 10}")
print(f"DEBUG: {DEBUG} (type: {type(DEBUG)})")
print(f"TIMEOUT_SEC: {TIMEOUT_SEC} (type: {type(TIMEOUT_SEC)})")
print(f"BASE_URL: {BASE_URL}")
config()
関数の便利な機能
-
必須項目の設定:
config("キー名")
と記述するだけで,もし.env
にそのキーが存在しない場合,プログラムが例外(UndefinedValueError
)を発生させるため,設定漏れにすぐ気づける. -
デフォルト値:
default
引数を指定すれば,キーが存在しない場合の初期値を設定できる. -
型変換:
cast
引数を使うと,.env
ファイル内では全て文字列として扱われる値を,bool
型やint
型など,適切なデータ型に自動で変換する.DEBUG
フラグの管理などが非常に容易になる.
まとめ
今回は,python-decouple
ライブラリを用いて,環境変数を安全に管理する方法を紹介した.
以下のポイントを確実に実践することで,安全でクリーンな開発を心がけるべきである.
-
.env
ファイルに秘匿情報を記述する -
.gitignore
で.env
ファイルを管理対象から除外する -
コードからは
config()
関数で読み込む