YAMLはDocker、Kubernetes、CI/CDパイプラインなど多くのツールで使用される設定フォーマットです。人間に優しい構文にもかかわらず、間違いやすい部分があります。
YAMLの使用場所
- Docker Compose
- Kubernetesマニフェスト
- GitHub Actions / GitLab CI
- Ansible Playbook
- 設定ファイル
基本構文ルール
インデント
YAMLはスペース(タブは不可)でインデントします:
# ✅ Correct (2-space indentation)
server:
host: localhost
port: 8080
database:
name: myapp
pool: 10
# ❌ Wrong (tab characters or inconsistent spaces)
server:
host: localhost # Tab character - INVALID!
port: 8080 # 3 spaces - inconsistent!キー・バリューペア
コロンとスペースで区切ります:
# ✅ Correct
name: John Doe
port: 8080
# ❌ Wrong - missing space after colon
name:John Doe複数行文字列
YAMLは2つのブロックスカラースタイルを提供します:
# | (literal block) - preserves newlines
description: |
This is line one.
This is line two.
Each newline is preserved.
# > (folded block) - folds newlines to spaces
description: >
This is a long paragraph
that will be joined into
a single line.データ型
| 型 | 構文 | 例 |
|---|---|---|
| String | plain, "quoted", 'quoted' | name: John |
| Integer | 42, 0xFF, 0o77 | port: 8080 |
| Float | 3.14, .inf, .nan | pi: 3.14159 |
| Boolean | true/false | debug: true |
| Null | null, ~, (empty) | value: null |
| Date | YYYY-MM-DD | date: 2026-02-10 |
「ノルウェー問題」
YAML 1.1では`NO`がboolean `false`として解釈されます。引用符を使いましょう:
# ❌ YAML 1.1 interprets these as booleans!
country: NO # → false
answer: yes # → true
switch: on # → true
# ✅ Fix: quote the values
country: "NO" # → string "NO"
answer: "yes" # → string "yes"
switch: "on" # → string "on"コレクション
# List (sequence)
fruits:
- apple
- banana
- cherry
# Nested map
database:
host: localhost
port: 5432
credentials:
user: admin
password: secret
# Inline / Flow style
fruits: [apple, banana, cherry]
point: {x: 10, y: 20}よくある10のエラー
| # | エラー | 原因 | 修正 |
|---|---|---|---|
| 1 | タブ文字エラー | タブ文字でインデント | スペースに置換 |
| 2 | 不統一なインデント | 2スペースと4スペースの混在 | 統一したインデントを使用 |
| 3 | コロン後のスペース欠落 | `key:value`と書く | コロン後にスペースを入れる |
| 4 | 引用符なしの特殊文字 | :や#を含む値に引用符なし | 特殊文字を含む文字列を引用 |
| 5 | ブール値の暗黙変換 | yes/no/on/offがブール値に | 引用符で囲む |
| 6 | コロンを含む文字列 | URLの2番目のコロンで切れる | 値全体を引用 |
| 7 | 重複キー | 同じキーが2回出現 | 重複キーを削除 |
| 8 | 末尾の空白 | 値の後に不可視のスペース | エディタで末尾空白を削除 |
| 9 | リストインデントエラー | リスト項目が親キーと揃っていない | インデントレベルを揃える |
| 10 | ドキュメント区切り欠落 | 複数ドキュメントに`---`なし | `---`を追加 |
YAML vs JSON vs TOML
| 機能 | YAML | JSON | TOML |
|---|---|---|---|
| Comments | # support | None | # support |
| Multi-line strings | | and > | \\n only | """ triple quotes |
| Data types | Rich (dates, etc.) | Basic (6 types) | Rich (dates, etc.) |
| Readability | High | Medium | High |
| Machine parsing | Complex | Simple | Medium |
| Best for | Config files | APIs, data exchange | App config |
ベストプラクティス
- CI/CDでYAMLリンターを使用
- エディタで空白文字を表示
- 2スペースインデントを使用
- 誤解される可能性のある文字列を引用
- スキーマバリデーションを使用
- ファイルを小さくモジュラーに
FAQ
YAMLでタブは使えますか?
いいえ。YAMLはインデントにタブ文字を厳格に禁止しています。
シングルクォートとダブルクォートの違いは?
シングルクォートはリテラル文字列、ダブルクォートはエスケープシーケンスを許可します。
YAMLでnullを表現するには?
`null`、`~`、または空の値を使用します。
なぜYAMLは"NO"をfalseとして扱うのですか?
YAML 1.1仕様がyes/no等をブール値として扱うためです。YAML 1.2ではtrue/falseのみ認識します。