CreaTools LogoCreaTools
JSON ⇄ YAML Converter

YAMLの暗黙型変換の罠|on/off/yes/noが勝手にbooleanになる問題

2026-01-13

この記事を読むと

YAMLの暗黙型変換を理解し、本番事故を未然に防げるようになる。

この仕様を知らないと、YAMLはエラーを出さずに静かに壊れる


何が起きるか

YAMLは「親切」に型を推測する。これが事故の元。

# 入力(意図:すべて文字列)
enabled: on
port: 01
optional: yes
// JSONに変換後(実際の解釈)
{
  "enabled": true,
  "port": 1,
  "optional": true
}

文字列のつもりが、勝手にbooleanや数値になる。


⚠ 本番で起きる事故

GitHub Actions が動かない

env:
  FEATURE_FLAG: on  # ← true になる

環境変数 FEATURE_FLAG を文字列 "on" として使うつもりが、true になる。 アプリが "on" という文字列を期待している場合、動作しない。

docker-compose が起動しない

services:
  app:
    ports:
      - 022:22  # ← 8進数として解釈される可能性
    environment:
      DEBUG: on  # ← true になる

Kubernetes の設定が効かない

metadata:
  labels:
    country: NO  # ← false になる(ノルウェー国コードのつもり)

CI が謎の失敗をする

version: 3.10  # ← 3.1 になる

バージョン 3.10 のつもりが 3.1 と解釈され、互換性エラー。


危険な値一覧

boolean扱いされる

# すべて true になる
- on
- yes
- true
- True
- TRUE
- y
- Y

# すべて false になる
- off
- no
- false
- False
- FALSE
- n
- N

数値扱いされる

# 数値になる
version: 1.0      # → 1
code: 01          # → 1
port: 080         # → 8進数として解釈される可能性
octal: 0o17       # → 15(8進数)
hex: 0xFF         # → 255(16進数)

null扱いされる

# null になる
value: ~
value: null
value: Null
value: NULL
value:            # 空値

対策:クォートで囲む

文字列として扱いたい値は、必ずクォートで囲む

# 安全
enabled: "on"
port: "01"
version: "3.10"
country: "NO"

迷ったらクォート

クォートなしクォートあり
ontrue"on"
offfalse"off"
yestrue"yes"
nofalse"no"
011"01"
3.103.1"3.10"
NOfalse"NO"

実際の修正例

Before(危険)

services:
  app:
    ports:
      - 80:80
    environment:
      FEATURE_FLAG: on
      DEBUG: yes
      VERSION: 3.10

After(安全)

services:
  app:
    ports:
      - "80:80"
    environment:
      FEATURE_FLAG: "on"
      DEBUG: "yes"
      VERSION: "3.10"

このツールの修正機能

YAML → JSON変換時に暗黙型変換を検出し、警告を表示する。

「修正」ボタンを押すと、入力YAMLの該当箇所が自動的にクォートで囲まれる。


YAMLバージョンによる違い

バージョンon/off の扱い
YAML 1.1boolean
YAML 1.2文字列(仕様上)

ただし多くのパーサーはYAML 1.1互換モードで動作する。 YAML 1.2だから安全、とは限らない。


チェックリスト

本番投入前に確認:

  • on/off/yes/no を使っていないか
  • 使っている場合、クォートで囲んでいるか
  • 先頭ゼロの値がないか
  • バージョン番号(3.10 等)がクォートで囲まれているか
  • ポート番号がクォートで囲まれているか

まとめ

危険な値解釈対策
on/yes/ytrue"on"
off/no/nfalse"off"
011"01"
3.103.1"3.10"
NOfalse"NO"

YAMLはエラーを出さない。間違った値として静かに処理される。迷ったらクォートで囲め。


関連記事