APIキーや実行モードをコードへ直接書くと、共有や環境切り替えのたびに修正が必要になります。環境変数へ分ければ、同じコードに別の設定を渡せます。ただし、環境変数へ移しただけで秘密情報が安全になるわけではありません。
ここでは、秘密を含まない設定値を使って、PowerShellからPythonへ値を渡す流れを確認します。実際のAPIキーを登録したり、外部APIへ接続したりする操作は含めません。
コードに必要な設定を洗い出す
まず、設定の名前、必須かどうか、値の形式、秘密かどうかを整理します。意味が異なる値を一つの変数へ詰め込まないようにします。
| 設定名の例 | 用途 | 扱い |
|---|---|---|
| APP_MODE | previewまたはproduction | 許可した値か検査する |
| APP_MAX_ITEMS | 1回に処理する最大件数 | 正の整数か検査する |
| OPENAI_MODEL | 使用するモデルID | 明示的に設定する |
| OPENAI_API_KEY | API認証 | 値を表示・記録しない |
OpenAIの公式SDKはOPENAI_API_KEYを環境から読み取ります。公式クイックスタートで、SDKに合わせた名前を確認してください。自作の変数名を設定しても、SDKが自動で読むとは限りません。
まず秘密を含まない値で試す
PowerShellでは次のように設定します。
$env:APP_MODE = "preview"
$env:APP_MAX_ITEMS = "5"
python config_example.py
この変更は現在のPowerShellセッションに作用し、そこから起動したPythonへ引き継がれます。既に起動している別のターミナルには反映されません。Microsoftの説明では、WindowsのProcess、User、Machineという設定範囲も区別されています。最初の動作確認に、すべての利用者へ影響する設定変更は必要ありません。
文字列を業務で使える値へ変換する
環境変数は文字列です。次をconfig_example.pyへ保存すると、未設定、想定外のモード、件数の誤りを処理の前に検出できます。
import os
def load_settings(env):
mode = env.get("APP_MODE", "").strip()
if mode not in {"preview", "production"}:
raise ValueError("APP_MODE の設定を確認してください")
raw = env.get("APP_MAX_ITEMS", "").strip()
if not raw.isascii() or not raw.isdecimal():
raise ValueError("APP_MAX_ITEMS は正の整数で指定してください")
maximum = int(raw)
if maximum < 1:
raise ValueError("APP_MAX_ITEMS は1以上にしてください")
return {"mode": mode, "max_items": maximum}
if __name__ == "__main__":
config = load_settings(os.environ)
print(config)
上の設定なら、modeがpreview、max_itemsが数値の5になります。この表示対象には秘密情報を含めていません。キーを扱う設定関数で、設定全体を同じようにprintすることは避けてください。
未設定を黙って補わない
本番用のキーやモデルがないとき、開発環境の値へ自動で切り替えると、意図しない接続が起こり得ます。必須値は未設定なら停止し、エラーには設定名だけを出します。値をログへ出して原因を探さないようにします。
.envファイルを使う方式もありますが、ファイルを置いただけでPythonが自動読込するわけではありません。採用する読込方法、共有対象から除く設定、配布する記入例を別に決めます。過去に秘密をコミットした場合は、以降の管理対象から外すだけでは漏えいを解消できません。
実際の秘密情報は組織で認めた保管・注入方法を使います。環境変数を読めるプロセスや担当者、障害時の診断情報、バックアップへ値が入る可能性も確認してください。
