概要
- YAML は人間に優しいデータ形式を目指すが、複雑さが逆効果になる場合が多い
- バージョンやパーサ依存の挙動、危険な落とし穴が多数存在
- JSON や TOML など、よりシンプルな代替案も複数存在
- YAMLの微妙な仕様がテンプレート化や構成管理を難しくする
- 最終的には 安全なサブセット利用 や JSON生成 が現実的な回避策
YAMLの複雑さと落とし穴
- YAML は人間に優しいフォーマットを目指すが、仕様が極めて複雑
- 仕様書は10章以上、4階層の節番号、専用のエラッタページまで存在
- バージョンごとに挙動が異なり、同じ文書でもパース結果が変化
- JSON と比較すると、YAMLは仕様も実装も遥かに難解
- JSONは仕様が6つの図で終わるシンプルさ
- YAMLは頻繁にバージョンアップされ、1.2.2(2021年10月)でも大きく仕様変更
- 代表的な落とし穴
- セクサジェシマル(60進数)表記 :22:22がバージョンによって数値や文字列に
- タグとエイリアス :!や*記法で予期せぬ解釈やエラー発生
- ノルウェー問題 :"no"や"on"がバージョンやパーサによってboolや文字列に
- 非文字列キー :on: などがboolキーとなり、言語によって型が変化
- 意図しない数値化 :9.6.24のようなバージョンが数値として解釈される危険
YAMLのパーサ依存性と安全性問題
- パーサごとに バージョン対応状況や解釈が異なる ため、同じYAMLでも動作がバラバラ
- PythonのPyYAMLは1.1仕様、Goのyamlパッケージは独自実装
- タグ機能により、 任意コード実行のリスク が存在
- yaml.safe_loadのような安全な読み込み関数利用が必須
- シンタックスハイライトに頼っても、各エディタやサービスごとに強調箇所が異なる
- Vim、GitHub、Codebergなどで一貫性がない
テンプレート化とYAMLの危険性
- YAMLのテンプレート化は 極めて危険
- ホワイトスペースや構文の微妙な違いで壊れやすい
- 断片的なテキストの結合・エスケープが困難
- KubernetesやGitHub Actionsなどでテンプレート化が多用されるが、 バグや予期せぬ挙動の温床
代替となる構成フォーマット
- TOML
- 文字列は常にクォートされ、YAML特有の落とし穴が少ない
- Python標準ライブラリでサポート、広い言語対応
- 深いネストにはやや不向き
- JSON with comments
- コメント可能な拡張JSON(VS Codeなどで採用)
- 普及度は限定的だが、シンプルな仕様
- YAMLの安全なサブセット
- 全ての文字列をクォート、yes/no等のbool表記を避ける
- 明示的なルール運用が必要だが、逸脱を自動検出するツールは未発達
JSON生成によるYAML回避
- 多くのアプリはYAMLしか受け付けないが、 YAMLはJSONのスーパーセット
- JSONを生成すればYAMLとしても利用可能
- 構成ファイルが肥大化し、抽象化やパーツ共有が必要になった場合
- テンプレートよりも Nix や Python 等のプログラミング言語による生成が安全
まとめ:YAMLの利用と今後
- YAMLは多機能だが、 仕様の複雑さと落とし穴 が多く、慎重な運用が必須
- 可能なら TOMLや拡張JSON の利用、YAMLが必須なら 安全なサブセット運用 や JSON生成 が推奨
- 長期的には、 より安全な構成管理手法や言語 の選択が望ましい