〜「.envって何のファイル?」が「あ、現場ごとに差し替える設定票と同じだ」に変わった話〜
こんにちは!ハンズオンラボ運営のえむです。
プログラミングを学んでいると必ず出てくる「環境変数」と「.envファイル」。
「なんでパスワードをコードに直接書いてはいけないの?」「.envってGitHubにあげてはいけないって聞いたけどなぜ?」
ちゃんと理由まで説明できますか?
この記事では、環境変数の仕組みを 「現場ごとに差し替える設定票」 というたとえで解説します。
この記事を読むと、以下のことができるようになります
- 環境変数が「なぜ必要か」を説明できる
- .envファイルの役割と正しい使い方がわかる
- なぜ.envをGitHubにあげてはいけないかがわかる
環境変数は「現場ごとに差し替える設定票」
建設現場の作業員が複数の現場を掛け持ちしているとします。
仕事の手順書(プログラム)は同じでも、「連絡先の電話番号」「倉庫の場所」「鍵の番号」は現場によって違います。毎回手順書を書き直すのは大変なので、「設定票」だけ差し替えるのが合理的です。
プログラムでも同じことが起きます。コードは同じでも、開発・テスト・本番で「DBのパスワード」「APIキー」「接続先URLが」違います。
環境変数とは**「プログラムが実行される環境ごとに差し替えられる設定値」**です。
なぜコードに直接書いてはいけないのか
パスワードやAPIキーをコードに直接書くと、何が起きるでしょう?
# NG:パスワードをコードに直接書く
DB_PASSWORD = "my_super_secret_password"
API_KEY = "sk-abc123xyz789"
db.connect(password=DB_PASSWORD)
このコードをGitHubにアップした瞬間、世界中にパスワードが公開されます。しかも一度GitHubにコミットされると、履歴から完全に消すのは非常に難しいのです。
実際、GitHubに誤ってAWSのアクセスキーを公開してしまい、数時間で数百万円の請求が来たという事例が多数報告されています。
.envファイルの使い方
環境変数は .env ファイルに書いて、プログラムから読み込むのが一般的です。
.envファイルの中身:
DATABASE_URL=postgres://user:password@localhost:5432/mydb
API_KEY=sk-abc123xyz789
SECRET_KEY=django-insecure-xxxxx
DEBUG=True
Pythonから読み込む:
# python-dotenv をインストール
# pip install python-dotenv
from dotenv import load_dotenv
import os
load_dotenv() # .envファイルを読み込む
db_url = os.getenv("DATABASE_URL")
api_key = os.getenv("API_KEY")
print(db_url) # postgres://user:password@localhost:5432/mydb
Linuxのターミナルから確認:
# 現在の環境変数を一覧表示
env
# 特定の環境変数を確認
echo $HOME
echo $PATH
# 環境変数を一時的に設定
export MY_API_KEY="test123"
echo $MY_API_KEY # test123
# プログラム実行時にのみ設定する
MY_API_KEY="test123" python app.py
.gitignoreで.envを除外する
.envファイルはGitHubに絶対にアップしてはいけません。.gitignore に登録して除外します。
# .gitignoreに追加(プロジェクトのルートに作成)
echo ".env" >> .gitignore
echo ".env.local" >> .gitignore
# .gitignoreの確認
cat .gitignore
# .env
# .env.local
# __pycache__/
# *.pyc
# .envが追跡されていないか確認
git status
# 追跡されていれば ".env" が表示される → すぐに除外を
代わりに .env.example(ダミー値を入れたサンプルファイル)をGitHubにアップして、チームメンバーが参考にできるようにします。
# .env.example(GitHubにアップしてOK)
DATABASE_URL=postgres://user:password@localhost:5432/mydb
API_KEY=your_api_key_here
SECRET_KEY=your_secret_key_here
ビフォーアフター
Before
-
.env→ 「なんかよく見るファイルだけど何?」 - パスワードをコードに直書き → 「とりあえず動くからいいや」
-
.gitignore→ 「設定したことない」
After
- 環境変数 → 「現場ごとに差し替える設定票。プログラムを変えずに設定だけ変えられる」
-
.env→ 「パスワード・APIキーなどの秘密情報をまとめたファイル。Gitに絶対にあげない」 -
.env.example→ 「チームに共有するサンプルファイル。ダミー値を入れてGitHubにアップ」
まとめ
- 環境変数は「プログラムが実行される環境ごとに差し替えられる設定値」
- パスワード・APIキーをコードに直書きすると、GitHubで世界中に公開されてしまう
- .envファイルに秘密情報をまとめて、プログラムから読み込む
-
.gitignoreに
.envを追加して、Gitの追跡対象から除外する - .env.example(ダミー値入り)はGitHubにアップしてチームで共有する
「.envをGitHubにあげてしまった」は取り返しのつかないミスになりえます。新しいプロジェクトを始めたら、まず .gitignore の設定を確認しましょう。
ハンズオンラボでは、実際に手を動かしながらセキュアな開発の基礎を体験するイベントを定期開催しています。
面白かったら
「👇いいね」で応援