インデントとスペース(タブ禁止、階層表現)

以下では、YAMLの「インデントとスペース(タブ禁止、階層表現)」を、実務でつまずきやすい点に絞って体系的に解説します。

1) 基本原則(ここだけは必ず守る)

  • インデントは半角スペースのみを使います。タブは不可(先頭インデントにタブが混ざると解析エラーになります)。

  • インデントは「親よりも深い」ことが条件です。一般的には2スペースを1段として使うのが定番です(4でも可)。

  • 同じレベルではインデント幅を揃える(2と4を混ぜない)。

  • 先頭(トップレベル)はインデント無しから始めます。

良い例(2スペース固定):

yaml
server: host: localhost port: 8080 ssl: enabled: true ciphers: - TLS_AES_128_GCM_SHA256 - TLS_AES_256_GCM_SHA384

悪い例(タブ混入・段ずれ):

yaml
server: \tport: 8080 # ← 先頭インデントにタブ(×) ssl: enabled: true # ← 同レベルなのに3スペース(×)

2) 階層表現(マップとシーケンス)

YAMLの階層はインデントの深さで表現します。

2.1 マップ(辞書)

  • 形式:key: value

  • ネストは子要素を1段深くします。

yaml
database: user: app pass: secret options: pool: 10 timeout: 30

2.2 シーケンス(配列)

  • 形式:- 値(ハイフンの後に半角スペース必須

  • 要素がスカラ(単純値)ならその行で完結、要素がオブジェクトなら次行以降を1段深く書きます。

スカラの配列:

yaml
paths: - /health - /metrics

オブジェクトの配列(「1要素=1オブジェクト」):

yaml
users: - name: Alice roles: - admin - editor - name: Bob roles: []

ありがちなミス(同じ要素内のキーがずれている):

yaml
# × 悪い例:同じダッシュ要素内の name と roles の桁がズレている users: - name: Alice roles: # ← ここだけ3スペースでズレ(×) - admin

同じ要素(同じダッシュの配下)に属するキーは同じ桁に揃えます。

3) コロンとハイフンのスペース規則

  • key:後ろに半角スペース1つ置いて key: value とします(key:value は避ける)。

  • シーケンスのハイフン -直後にも半角スペース1つが必要です(-value は不可)。

  • コロンを縦に整列させる必要はありません(見た目を揃えても意味は変わりません)。

良い例:

yaml
api: url: https://example.com retry: 3 endpoints: - /v1/items - /v1/orders

4) ブロック・スカラー(複数行文字列)とインデント

複数行の文字列は |(リテラル:改行を保持)か >(フォールド:行折りたたみ)を使います。
ブロック内の各行は、親より1段深くインデントします。

改行を保持(|):

yaml
message: | 1行目はそのまま 2行目もそのまま改行が残る

折りたたみ(>):

yaml
message: > これは論理的には1行に 折りたたまれて解釈されます

高度な指定(必要に応じて):

  • チョンピング(末尾改行の扱い):|-(末尾改行を削除)、|+(末尾改行を保持)

  • インデント指示子|2>4 のように数字でブロックのインデント基準を明示可能

yaml
script: |- echo "hello" exit 0 note: |2 先頭インデント「2」を基準に 取り除いて解釈されます

5) 空行・コメント・タブの扱い

  • 空行は可。階層には影響しません。

  • コメント# 以降。インデントして書いても意味は変わりません。

  • タブインデントには使用不可。ただし文字列の中身としては現れ得ます。必要ならダブルクォート内で \t を使うのが安全です。

yaml
title: "タブを含む文字列は \t のようにエスケープ"

6) 実務でのチェックリスト

  • 先頭インデントにタブが紛れていないか(エディタ設定で「タブ→スペース」を有効に)。

  • インデント幅を統一(2か4のどちらかに固定、同じレベルで混在しない)。

  • key: value- valueスペースを守る。

  • 配列要素内の複数キーは同じ桁に揃える。

  • 複数行文字列は親より1段深くし、|> の違いを意識する。

7) まとめ(最小パターン集)

マップのネスト:

yaml
app: name: demo log: level: info

配列(スカラ):

yaml
regions: - ap-northeast-1 - us-east-1

配列(オブジェクト):

yaml
jobs: - id: build steps: - checkout - test - id: deploy steps: - package - release

ブロック・スカラー:

yaml
description: | この行は保持 改行も保持

この規則を守れば、YAMLの構造は常にインデントで一意に表現でき、パーサに正しく解釈されます。特に「タブ禁止」「同一レベルでのインデント幅統一」「ハイフンとコロン後のスペース」の3点を最優先で意識してください。

ChatGPT5 生成日:2025/09/04