環境変数管理
テクノロジ系 / L09 file-io — ファイル永続化
環境変数管理 — ハンズオン
前提: Pythonがインストールされている
目標: .env にAPIキーを設定してPythonから読み込める
Step 1: python-dotenvをインストールする
pip install python-dotenv
Step 2: .envファイルを作成する
cd ~/workspace/env-practice # .envを作成(値は仮のものでOK) cat > .env << 'EOF' API_KEY=test-api-key-12345 DATABASE_URL=postgresql://localhost/testdb DEBUG=true APP_NAME=MyApp EOF # 権限制限 chmod 600 .env # 確認(内容は表示されない) ls -la .env # → -rw------- が表示されればOK
Step 3: Pythonから読み込む
read_env.py を作成:
from dotenv import load_dotenv
import os
# .envを読み込む
load_dotenv()
# 取得
api_key = os.getenv("API_KEY")
db_url = os.getenv("DATABASE_URL")
debug = os.getenv("DEBUG")
app_name = os.getenv("APP_NAME")
print(f"API_KEY: {api_key[:4]}...") # 先頭4文字だけ表示
print(f"DATABASE_URL: {db_url}")
print(f"DEBUG: {debug}")
print(f"APP_NAME: {app_name}")
# デフォルト値付き
timeout = os.getenv("TIMEOUT", "30")
print(f"TIMEOUT: {timeout}(.envに未定義のためデフォルト値)")実行:
python3 read_env.py
Step 4: .gitignoreに追加する
# .gitignoreを作成または追記 echo ".env" >> .gitignore # 確認 cat .gitignore
Gitリポジトリがある場合: .env が追跡対象になっていないか確認する。
git status # .env が表示されないことを確認(.gitignoreが効いていれば表示されない)
Step 5: 環境変数がNoneになる問題をデバッグする
debug_env.py を作成:
from dotenv import load_dotenv
import os
# load_dotenv() を呼ばない場合
value_without_load = os.getenv("API_KEY")
print(f"load_dotenv()前: {value_without_load}") # → None
# load_dotenv() を呼んだ後
load_dotenv()
value_after_load = os.getenv("API_KEY")
print(f"load_dotenv()後: {value_after_load}")
# 存在しないキー
missing = os.getenv("NOT_EXISTS")
missing_with_default = os.getenv("NOT_EXISTS", "デフォルト値")
print(f"存在しないキー: {missing}") # → None
print(f"デフォルト値付き: {missing_with_default}") # → デフォルト値確認: load_dotenv() を呼ぶ前後で値が変わることを確認する。
完了チェック
- [ ]
.envファイルを作成してchmod 600で権限制限した - [ ]
load_dotenv()で読み込んでos.getenv()で取得できた - [ ]
.gitignoreに.envを追加した - [ ]
load_dotenv()を呼ばないとNoneになることを確認した - [ ]
.envに書いてないキーにデフォルト値を設定できた
考えてみよう
既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。
Q1. APIキーを .env に分離する主な理由を2つ挙げてください。
- セキュリティ: Gitにpushしてしまうと公開リポジトリでキーが公開される。
.gitignoreに追加することで誤pushを防ぐ。 - 保守性: キーを変更するときにコードを修正する必要がなく、
.envファイルだけ変えればよい。
Q2. os.getenv("KEY") と os.environ["KEY"] の違いは?
os.getenv("KEY"): キーが存在しない場合は None を返す。デフォルト値も指定できる(os.getenv("KEY", "default"))。
os.environ["KEY"]: キーが存在しない場合は KeyError を発生させる。
通常は os.getenv() を使う方が安全。
Q3. 以下のコードを実行すると api_key は None になります。なぜですか? また修正方法は?
import os
api_key = os.getenv("API_KEY")
print(api_key) # None原因: load_dotenv() を呼んでいないため、.env ファイルが読み込まれていない。
修正:
from dotenv import load_dotenv
import os
load_dotenv() # ここに追加
api_key = os.getenv("API_KEY")
print(api_key)Q4. .env を作成した後に chmod 600 .env を実行する理由は?
chmod 600 はファイルの権限を「所有者のみ読み書き可」に制限する。
これにより、同じサーバーにアクセスできる他のユーザーが .env の内容を読めなくなる。
APIキーや認証情報が含まれるファイルには必ず設定する。