YAML:雑然さのない設定ファイル
なぜYAMLが設定ファイルの標準になったか、そして落とし穴を避ける方法。
すべてのKubernetesマニフェスト。すべてのGitHub Actionsワークフロー。すべてのDocker Composeファイル。
YAMLは設定のあらゆる所にあります。読みやすく、柔軟で、驚くべき癖があります。
なぜYAML?
JSONは厳格:ダブルクォート、コメントなし、末尾カンマなし。
YAMLは寛容:最小限の構文、コメント可、人間が読める。
# YAML設定
database:
host: localhost
port: 5432
name: myapp
{
"database": {
"host": "localhost",
"port": 5432,
"name": "myapp"
}
}
同じデータ、YAMLではより少ないノイズ。
基本
キーバリューペア:
name: John
age: 30
ネスト構造(スペース使用、タブじゃない):
person:
name: John
age: 30
リスト:
colors:
- red
- green
- blue
インラインリストとオブジェクト:
colors: [red, green, blue]
person: {name: John, age: 30}
ノルウェー問題
country: NO
NO は何?ブール値 false。YAMLは NO、Yes、on、offなどをブール値として解釈。
ノルウェーの国コードが false になります。設定が謎の方法で壊れます。
修正: ブール値と解釈されうる文字列をクォート。
country: "NO"
複数行文字列の問題
description: This is a long
description that continues
これは2行ですか、それとも「that continues」がインデントされた1行?YAMLパーサーによります。
明示的な複数行:
# リテラル(改行を保持)
description: |
Line one
Line two
# 折りたたみ(行を結合)
description: >
This is one long
line when parsed
インデントが重要
2スペース。タブじゃない。1スペースじゃない。3スペースでもない。
# 正しい
parent:
child: value
# 間違い - タブ文字
parent:
child: value
タブとスペースの混在はYAMLを静かに壊します。エディタをスペース使用に設定しましょう。
数値の解釈
version: 1.10
これは文字列「1.10」ですか、それとも数値1.1?ほとんどのパーサーは1.1と解釈。
浮動小数点数学が再び襲います。バージョン番号をクォートしましょう。
version: "1.10"
アンカーとエイリアス
YAMLは繰り返しコンテンツを参照できます:
defaults: &defaults
timeout: 30
retries: 3
production:
<<: *defaults
timeout: 60
重複削減には強力。やりすぎると混乱。
YAMLの検証
YAMLの柔軟性は見た目が有効な多くのものが実際は無効であることを意味します。
- エディタでリンターを使う
- 可能な時はスキーマに対して検証
- パーサーが実際に何を解釈したかを見るためにJSONに変換
設定が機能していないなら、書いたものではなくパーサーが何を見ているかチェック。
YAML vs JSON vs TOML
YAML: 人間が読める、多くの機能、癖のあるエッジケース。
JSON: 厳格、シンプル、広くサポート、冗長。
TOML: 明示的、驚きが少ない、設定で人気上昇中。
マシン間データには、JSONの方が安全。人間編集の設定には、落とし穴を知っていればYAMLが機能。
YAMLは厳格さより可読性を優先。そのトレードオフがエッジケースを作ります。ブール値や数値に見える文字列をクォートし、明示的な複数行構文を使い、デプロイ前に検証しましょう。