採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

環境変数管理

テクノロジ系 / 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つ挙げてください。

  1. セキュリティ: Gitにpushしてしまうと公開リポジトリでキーが公開される。.gitignore に追加することで誤pushを防ぐ。
  2. 保守性: キーを変更するときにコードを修正する必要がなく、.env ファイルだけ変えればよい。

Q2. os.getenv("KEY")os.environ["KEY"] の違いは?

os.getenv("KEY"): キーが存在しない場合は None を返す。デフォルト値も指定できる(os.getenv("KEY", "default"))。

os.environ["KEY"]: キーが存在しない場合は KeyError を発生させる。

通常は os.getenv() を使う方が安全。

Q3. 以下のコードを実行すると api_keyNone になります。なぜですか? また修正方法は?

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キーや認証情報が含まれるファイルには必ず設定する。

力試ししたい方は クイズ形式の演習(任意) もあります。読むだけでも十分です。