YAMLからENV変換におけるブール値の扱い

YAMLブール値(true、false、yes、no、on、off)が、すべての値が文字列であるENV形式への変換時にどのように処理されるかを解説します。

Basic Conversion

詳細な説明

ブール値はYAMLとENV形式間の変換で特に注意が必要です。YAMLにはブール表現の豊富なセットがありますが、ENVファイルではすべてがプレーン文字列として扱われます。この不一致を慎重に処理しないと、微妙なバグの原因になります。

YAMLブール値(YAML 1.1はこれらすべてを認識):

feature_enabled: true
debug_mode: false
use_ssl: yes
verbose: no
maintenance: on
notifications: off
strict_mode: True
legacy_support: FALSE

標準的なENV変換:

FEATURE_ENABLED=true
DEBUG_MODE=false
USE_SSL=true
VERBOSE=false
MAINTENANCE=true
NOTIFICATIONS=false
STRICT_MODE=true
LEGACY_SUPPORT=false

なぜこれが重要か:

YAMLがパースされると、yesnoonoffTrueFALSEなどの値はすべてブール値trueまたはfalseとして解釈されます。適切なYAML-to-ENVコンバーターは、これらすべてを標準的なtrue/false文字列に正規化します。

消費側での問題:

異なる言語やフレームワークはENVブール文字列を異なる方法でパースします:

// Node.js - 自動的なブールパースなし
process.env.DEBUG_MODE          // "false" (文字列)
process.env.DEBUG_MODE === true // false (正しい)
process.env.DEBUG_MODE == true  // false (正しい)
Boolean(process.env.DEBUG_MODE) // true! (誤り - 空でない文字列はすべてtruthyになる)
# Python
os.environ["DEBUG_MODE"]             # "false" (文字列)
bool(os.environ["DEBUG_MODE"])       # True! (誤り - 空でない文字列はすべてtruthyになる)
os.environ["DEBUG_MODE"] == "true"   # False (正しい方法)

ベストプラクティス:

  1. YAMLからENVに変換する際は常にtrue/falseに正規化する。 yeson1などは出力しない。
  2. アプリケーションコードでは、言語ネイティブのブールキャストを使うのではなく、文字列"true"と明示的に比較する。
  3. フレームワークが数値ブール値を期待する場合は**1/0の使用を検討する**。
  4. プロジェクトのREADMEまたは.env.exampleファイルで規約を文書化する

元のYAMLブールスタイル(例:yes vs true)を保持する必要がある場合は、YAML内で値をクォートします: use_ssl: "yes" -- これによりブールではなく文字列として扱われます。

ユースケース

YAML設定で無効化機能に「no」を使用していたところ、ENVの値「false」がPythonでtruthyとして評価されていたために、アプリケーションのフィーチャートグルが常にアクティブになっていた本番障害をデバッグする場合。

試してみる — YAML ↔ ENV Converter

フルツールを開く