5.

YAML(.yaml/.yml)の完全ガイド — インデント・アンカー・Norway 問題・Kubernetes/Ansible/CI

編集
この記事の要点
  • YAML(YAML Ain't Markup Language)は人間が読み書きしやすい設定向けデータ形式
  • インデント(スペース)で構造を表すため、タブ混在やズレで簡単に壊れる
  • Kubernetes・Ansible・GitHub Actions・Docker Compose・CI 設定の事実標準
  • アンカー (&) とエイリアス (*)、マージキー (<<:) で重複を省ける
  • Norway 問題: 裸の no が false と解釈されるなど、暗黙の型変換が地雷
  • YAML 1.2 は JSON のスーパーセット。yq で CLI 操作、JSON Schema で検証

概要

YAML(ヤメル、YAML Ain't Markup Language)は、2001 年に Clark Evans・Ingy döt Net・Oren Ben-Kiki によって提唱された、人間が読み書きしやすい構造化データ形式です。当初は "Yet Another Markup Language" の頭文字でしたが、マークアップ言語ではなくデータ表現言語であることを強調するため再帰的略称(GNU 流のジョーク)に改名されました。

拡張子は .yaml または .yml、MIME タイプは application/yaml(RFC 9512、2024 年)。最新仕様は YAML 1.2.2(2021 年)で、JSON のスーパーセットとして再設計されています。Kubernetes のマニフェスト、Ansible の Playbook、GitHub Actions のワークフロー、Docker Compose、GitLab CI、CircleCI など、現代の CI/CD・IaC 領域で最も広く使われる設定形式です。

構文・データモデル

YAML はインデント(スペース、タブ不可)でネスト構造を表します。データモデルは JSON とほぼ同じ(mapping / sequence / scalar)です。

name: Alice
age: 30
active: true
roles:
  - admin
  - dev
address:
  city: Tokyo
  zip: "100-0001"
deleted_at: null
# コメントも書ける
description: |
  複数行の
  リテラルブロック

強力な機能としてアンカーとエイリアスがあります。同じデータを &name で印を付け、*name で参照、<<: *name でマージできます。

defaults: &defaults
  timeout: 30
  retries: 3

prod:
  <<: *defaults
  host: prod.example.com

dev:
  <<: *defaults
  host: dev.example.com

区切り線 --- でひとつのファイルに複数ドキュメントを入れられます(Kubernetes マニフェストで頻出)。

主な用途

  • Kubernetes マニフェスト: Pod / Deployment / Service など全リソース定義
  • Ansible Playbook: 構成管理の宣言的記述
  • CI/CD: GitHub Actions .github/workflows/*.yml、GitLab CI .gitlab-ci.yml、CircleCI .circleci/config.yml
  • Docker Compose: docker-compose.yml でサービス・ネットワーク・ボリュームを定義
  • OpenAPI / Swagger: API スキーマ定義(JSON より YAML 版の方が編集しやすいため好まれる)
  • Hugo・Jekyll・MkDocs: 静的サイトジェネレータの設定や記事の Front Matter

関連形式との比較

項目YAMLJSONTOMLXML
コメント可(#不可可(#
人間可読性非常に高い高(フラット)
機械パース安全性低(暗黙変換)非常に高い
参照・再利用アンカー/エイリアスなしなし外部実体
インデント依存あり(致命的)なしなしなし
主用途CI・IaC・K8sAPI・データ交換言語設定文書・古い API

編集・パーサ・ツール

  • yq: jq の YAML 版(Mike Farah 版が現在の主流)。yq '.spec.replicas' のように使う
  • yamllint: 構文・スタイル違反を検出する Linter
  • パーサライブラリ: Python PyYAML / ruamel.yaml、Ruby Psych、Go go-yaml、JavaScript js-yaml、PHP symfony/yaml
  • JSON Schema 連携: YAML を JSON 相当として扱えるため、JSON Schema で型検証ができる
  • VS Code 拡張: Red Hat YAML 拡張がスキーマ連携・補完・diagnostics を提供(Kubernetes・GitHub Actions の補完が強力)

注意点・落とし穴

  • インデントが命: タブとスペースが混在するとパースエラー。エディタで「スペース 2 個」に統一する
  • Norway 問題: ノルウェーの国コード NOnooffyeson が YAML 1.1 では boolean に暗黙変換される。1.2 ではこの仕様は削除されたが、PyYAML など 1.1 互換実装は今も影響を受ける。文字列として確実に扱いたいなら "no" とクォートする
  • 裸文字列の罠: 電話番号や郵便番号も先頭ゼロが落ちたり八進数扱いになることがある。クォート推奨
  • 巨大ファイルの編集: ネストが深くなるとどの階層にいるか分からなくなる。VS Code のブレッドクラム機能を活用
  • YAML 爆弾(Billion Laughs): アンカーを多用したファイルでメモリ枯渇 DoS が起きうる。信頼できないソースからの YAML を safe_load 系で読む
  • パーサ依存の差異: 同じファイルが Python・Ruby・Go で微妙に解釈が違うことがある。CI でテストする

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. HTML(.html / .htm)
  2. CSS(.css)
  3. JSON(.json)
  4. XML(.xml)
  5. YAML(.yaml / .yml)
  6. TOML(.toml)
  7. env(.env)
  8. INI(.ini)
  9. properties(.properties)
  10. conf(.conf)

最近更新/作成されたページ