docker-compose.ymlのインデントを1つ間違えただけでコンテナが起動しなくなり、原因究明に小一時間を溶かしたことがあります。「なんとなく書けてしまう」フォーマットだからこそ、一度ちゃんと整理しておこうと思ったのがこのシリーズのきっかけです。
YAMLとは
図1: 同じデータでも、記号の量と視認性が形式によって大きく異なる
YAML(YAML Ain't Markup Language、あるいは元の意味である Yet Another Markup Language の再帰的頭字語)は、インデント(字下げ)で階層構造を表現するデータシリアライゼーション言語です。2001年に最初の仕様が公開され、現在は多くの開発ツール・クラウドサービスの設定ファイル形式として事実上の標準になっています。
XMLやJSONと同じく「構造化データをテキストで表現する」ための形式ですが、YAMLは人間が読み書きすることを強く意識して設計されています。中括弧やクォートを最小限に抑え、インデントだけで階層を表現できる点が最大の特徴です。
主な用途 — どこで使われているか
YAMLは特定の言語やフレームワークに紐づかない汎用フォーマットのため、実に幅広いツールの設定ファイルとして採用されています。
docker-compose.yml 1枚で定義する。サービス・ネットワーク・ボリュームを宣言的に記述。.github/workflows/*.yml でCI/CDパイプラインのジョブ・ステップ・トリガー条件を定義する。kubectl apply -f で適用する。
このほかにも、静的サイトジェネレータのFront Matter、OpenAPI(Swagger)仕様書、各種Lintツールの設定ファイル(.eslintrc.yml など)まで、「アプリのコードではなく、周辺の設定を書く」場面でYAMLが選ばれることが非常に多くなっています。
JSON・XMLとの比較(○×表)
同じ「構造化データの記述言語」として比較されることが多いJSON・XMLと、実務でよく問題になる観点で比較しました。○=標準で対応、△=実装や運用でカバー可能、×=標準では非対応という基準です。
| 観点 | YAML | JSON | XML |
|---|---|---|---|
| コメントの記述 | ○ # で可能 |
× 標準では非対応 | △ <!-- -->で可能 |
| 人間にとっての読みやすさ | ○ 記号が少なく高い | △ 括弧・クォートが多い | × 閉じタグで冗長 |
| プログラムからの扱いやすさ | △ パーサー依存の差異あり | ○ 仕様がシンプルで一貫 | △ スキーマ定義は強力だが複雑 |
| 複数ドキュメントの表現 | ○ ---区切りで標準対応 |
× 標準では非対応 | × ルート要素は1つのみ |
| データ型の表現力 | ○ 日付型なども解釈可能 | △ 文字列・数値・真偽値のみ | × すべて文字列(属性で補完) |
| パース速度 | × JSONより低速な傾向 | ○ 高速 | △ ツール・実装依存 |
⚠️ インデント依存はメリットでもリスクでもある
YAMLの読みやすさは「インデントで階層を表す」という設計から来ていますが、裏を返せばインデントのズレがそのまま構造の誤りに直結します。タブ文字が使えない・全角スペースが混入すると即座にエラーになる点は、JSON/XMLにはない注意点です。この対策はPART 02・PART 05で扱います。
なぜここまで普及したのか
YAMLが設定ファイルの標準的な選択肢になった背景には、単に「読みやすいから」だけでなく、いくつかの実務的な理由があります。
- コメントが書ける — 「なぜこの値なのか」を設定ファイルの中に残せる。JSONにはこれができない。
- 差分が読みやすい — Gitのdiffで見たときに、変更箇所が直感的に把握しやすい。
- 言語非依存 — Python・Go・Rubyなど、ほぼすべての主要言語に成熟したパーサーライブラリが存在する。
- JSONの上位互換に近い — 多くのYAMLパーサーはJSONもそのまま読み込める(JSONはYAMLのサブセットに近い)。
YAMLの弱点も知っておく
普及している一方で、YAML特有の落とし穴も知られています。代表的なのが「ノルウェーの問題」と呼ばれるもので、YAML 1.1では NO や YES、on / off といった単語が自動的に真偽値(boolean)と解釈されてしまい、国名コード「NO(ノルウェー)」を文字列のつもりで書いたら false になっていた、という事故が実際に起きています。
💡 回避策
意図せず真偽値・数値と解釈されるのを防ぐには、文字列として扱いたい値を "NO" のように明示的にクォートで囲みます。この点はPART 03(スカラー値の型)で詳しく扱います。
本シリーズの構成
全5回で、ツール導入から基本記法、応用記法、記述ルールの統一までを一通り解説します。
| PART | 内容 |
|---|---|
| 01(本記事) | YAMLの特徴、用途、JSON/XMLとの比較 |
| 02 | ツール導入 — VS Code拡張機能とyamllintによる構文チェック環境構築 |
| 03 | 基本記法 — マッピング・シーケンス・スカラー値とインデントルール |
| 04 | 応用記法 — アンカー・参照・複数ドキュメント・フロースタイル |
| 05 | 記述ルールとベストプラクティス — Lint統一とCI組み込み、まとめ |