YAMLチートシート - 構文・型・実用パターンリファレンス

2026.04.10

公式ドキュメント

この記事の要点

• インデントは半角スペースのみ(タブ禁止)、2スペースが標準
|(改行保持)と>(折りたたみ)で複数行文字列を制御
&(アンカー)と*(エイリアス)で設定の重複を排除

概要

YAML(YAML Ain’t Markup Language)は人間にとって読みやすいデータシリアライゼーション言語です。インデントによる階層構造、最小限の記号、JSON のスーパーセットという特徴から、Kubernetes、GitHub Actions、Ansible、Docker Compose、各種フレームワークの設定ファイルなどで広く採用されています。本チートシートは現行仕様 YAML 1.2.2 を対象に、実用上必要となる構文と注意点を整理します。

基本ルール

  • インデントは半角スペースのみ。タブは禁止。
  • 同じ階層は同じインデント幅で揃える。
  • コメントは # から行末まで。
  • 文字列は基本的にクォート不要だが、特殊文字を含む場合は必須。
  • ファイル拡張子は .yaml または .yml(公式は .yaml 推奨)。
  • 1 ファイルに複数ドキュメントを書く場合は --- で区切り、... で終端できる。

スカラー型

文字列name: Alice / "Alice" / 'Alice'
整数age: 30 / 0o17(8 進)/ 0x1F(16 進)
浮動小数pi: 3.14 / 1.0e-3 / .inf / .nan
真偽値enabled: true / false
Nullvalue: null / ~ / 空
日付date: 2026-04-10
日時ts: 2026-04-10T12:34:56Z

注意: true/false/yes/no/nullは予約語として解釈されます。文字列として使いたい場合は必ずクォートで囲みましょう(例: "NO""true")。

文字列のクォート

形式説明
クォートなしplain: hello world特殊文字を含まない通常の文字列
シングル'a ''b'' c'\ はリテラル、” でエスケープ
ダブル"line1\nline2"\n などのエスケープ可

クォートが必要な代表例:

  • 値が true/false/yes/no/null/~ などの予約語
  • 数字に見える文字列("007""3.14"
  • 先頭が : - ? & * ! | > ' " % @ の文字
  • コロン + スペースを含む文字列

シーケンス(配列)

# ブロック形式
fruits:
  - apple
  - banana
  - cherry

# フロー形式(JSON 風)
fruits: [apple, banana, cherry]

# ネスト
matrix:
  - [1, 2, 3]
  - [4, 5, 6]

マッピング(オブジェクト)

# ブロック形式
user:
  name: Alice
  age: 30
  email: alice@example.com

# フロー形式
user: { name: Alice, age: 30 }

# シーケンス内のマッピング
users:
  - name: Alice
    age: 30
  - name: Bob
    age: 25

ポイント: YAMLにはブロック形式(インデントで構造化)とフロー形式[]/{}でJSON風に記述)の2通りがあります。読みやすさを優先してブロック形式を使うのが一般的です。

複数行文字列

記法改行扱い末尾改行
``保持
`-`保持
`+`保持
>折りたたみ(空白に変換)1 つ残す
>-折りたたみ削除
>+折りたたみ全て残す
literal: |
  line 1
  line 2
  line 3

folded: >
  this is
  one long
  sentence

trimmed: |-
  no trailing newline

double: "escape \n included"

実践メモ: |は改行をそのまま保持、>は改行をスペースに変換(折りたたみ)。末尾の-を付けると最後の改行を削除、+は全ての末尾改行を保持します。

アンカーとエイリアス

同じ値を再利用する仕組みです。&name で定義し、*name で参照、<<: *name でマージできます。

defaults: &defaults
  adapter: postgres
  host: localhost
  pool: 5

development:
  <<: *defaults
  database: app_dev

production:
  <<: *defaults
  database: app_prod
  host: db.prod.example.com

注意: マージキー << は YAML 1.1 の拡張で、1.2 仕様では公式機能ではありませんが、多くのパーサ(PyYAML、libyaml、Ruby Psych など)で実装されています。GitHub Actions など一部のパーサではサポートされない場合があるため、利用前に対象パーサを確認してください。

明示的なタグ

タグで型を強制できます。

タグ説明
!!intyear: !!int "2026"文字列を整数に強制
!!floatpi: !!float "3.14"文字列を浮動小数に強制
!!boolyes: !!bool "true"文字列をブール値に強制
!!seqitems: !!seq [1, 2, 3]シーケンス型を明示
!!binarydata: !!binary | ...バイナリデータを Base64 で埋め込み

複数ドキュメント

記号説明
---ドキュメント区切り(開始)
...ドキュメント終端(省略可)

Kubernetes マニフェストなどでよく使われます。

ポイント: &nameでアンカー定義、*nameで参照、<<: *nameでマージ。環境ごとの設定ファイルで共通部分を一箇所にまとめられます。

注意: タブ文字は禁止です。エディタの設定で「タブを半角スペースに変換」を有効にしましょう。見た目は同じでもタブが混入するとパースエラーになります。

実用例

1. GitHub Actions ワークフロー

name: ci
on:
  push:
    branches: [main]
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node: [20, 22]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
          cache: npm
      - run: npm ci
      - run: npm test

2. Docker Compose

services:
  web:
    image: nginx:1.27
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    depends_on:
      - api
  api:
    build: ./api
    environment:
      DATABASE_URL: postgres://app:secret@db:5432/app
    restart: unless-stopped
  db:
    image: postgres:17
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

3. Kubernetes Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  labels:
    app: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: web
          image: nginx:1.27
          ports:
            - containerPort: 80
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 500m
              memory: 256Mi

4. Ansible Playbook

- hosts: web
  become: true
  vars:
    package: nginx
  tasks:
    - name: Install nginx
      apt:
        name: "{{ package }}"
        state: present
        update_cache: true
    - name: Ensure nginx running
      service:
        name: nginx
        state: started
        enabled: true

5. アプリケーション設定(Spring Boot 風)

server:
  port: 8080
  servlet:
    context-path: /api
spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/app
    username: app
    password: secret
  jpa:
    hibernate:
      ddl-auto: validate
logging:
  level:
    root: INFO
    com.example: DEBUG

6. アンカーで重複排除

.x-common: &common
  restart: unless-stopped
  logging:
    driver: json-file
    options:
      max-size: "10m"

services:
  api:
    <<: *common
    image: my/api
  worker:
    <<: *common
    image: my/worker

7. 環境ごとに値を切り替え

defaults: &defaults
  log_level: info
  timeout: 30

development:
  <<: *defaults
  debug: true

production:
  <<: *defaults
  log_level: warn
  timeout: 10

8. JSON との互換

YAML 1.2 は JSON のスーパーセットなので、JSON はそのまま貼り付けて読み込めます。

{ "name": "Alice", "tags": ["dev", "ops"] }

実践メモ: CIでyamllintを導入すると、インデントの不整合やスタイルの問題を自動検出できます。エディタのYAML Language Server拡張機能でリアルタイム検証も可能です。

よくある落とし穴

説明
Norway 問題country: NO がブール false に解釈される(YAML 1.1)。"NO" とクォートする
yes/no/on/offYAML 1.1 でブール扱い。1.2 では文字列だがパーサ依存
8 進数先頭 0 の数字は 8 進数になる場合あり(YAML 1.1)。文字列として扱うならクォート
先頭の *フロー文字列で「エイリアス参照」と誤解されるのでクォート
インデント混在同一階層で 2 / 4 スペースを混ぜない
タブタブ文字は禁止。エディタの設定で半角スペースにする
末尾コロンkey: だけで値がないと null になる
重複キー多くのパーサは後勝ち、または警告/エラー
真偽値の True/TRUE1.1 ではブールだが 1.2 ではパーサ次第。小文字 true/false を推奨

バリデーションツール

ツール用途
yamllintスタイル/構文チェック
kubeval / kubeconformKubernetes マニフェスト検証
actionlintGitHub Actions の検証
python -c "import yaml; yaml.safe_load(open('f.yml'))"簡易構文確認
yqjq 風の YAML 操作

yq クイック例

コマンド説明
yq '.services.web.image' docker-compose.yml値を取得
yq '.spec.replicas = 5' deployment.yaml値を更新(標準出力)
yq -i '.version = "2.0.0"' chart.yamlファイルを直接更新
yq -o=json '.' file.yamlYAML → JSON 変換
yq -P '.' file.jsonJSON → YAML 変換

トラブルシューティング

症状原因と対処
mapping values are not allowed hereコロンの後にスペースがない、または同じ行に値が来ている
found character that cannot start any tokenタブが混入、または不正なインデント
値が予期せず true/false になるyes/no/on/off/y/n を文字列としてクォート
数字の先頭ゼロが消える文字列として "007" のように書く
マージキーが効かないパーサが << をサポートしているか確認
改行が消える / 増える`
日本語が文字化けUTF-8 で保存し、BOM を付けない
同じキーが複数あって反映されないYAML は重複キーを基本的に許容しない

Tips & ベストプラクティス

  • 半角スペース 2 文字インデントを基本にし、ファイル全体で統一する。
  • ブール風の値や数字風の文字列はクォートする。特に country: NO のような国コードは要注意。
  • 機密情報を直接書かず、環境変数や Secret 管理ツール(Vault、SOPS、Kubernetes Secret)を使う。
  • 大規模な YAML はアンカー/エイリアスで重複を減らすか、テンプレートエンジン(Helm、kustomize)を活用する。
  • CI で yamllint を回し、スタイルエラーを早期発見する。
  • スキーマがあるツール(Kubernetes、Compose、GitHub Actions)はエディタの拡張機能(YAML Language Server)でリアルタイム検証する。
  • 1 ファイルの行数が多くなったら分割を検討する。Kubernetes は --- で複数ドキュメントを 1 ファイルにまとめられる。
  • YAML を生成するスクリプトでは、安全な公式ライブラリ(PyYAML の safe_dump、Ruby Psych など)を使い、独自に文字列連結しない。
  • 互換性を重視するなら 1.2 仕様に従い、yes/no などの曖昧な値は避ける。
  • 設定ファイルは git 管理し、レビューを通すことで構文崩れを防ぐ。

YAML と JSON の対応関係

YAML 1.2 は JSON のスーパーセットです。多くの場合、JSON はそのまま有効な YAML として読み込めます。

JSONYAML
{"a": 1}a: 1
[1, 2, 3]- 1 / - 2 / - 3
"hello"hello
true / false / nulltrue / false / null
1.51.5
{"k": null}k: null または k: ~

JSON ⇄ YAML 変換は yq で簡単に行えます。

コマンド説明
yq -o=json '.' input.yaml > output.jsonYAML → JSON
yq -P '.' input.json > output.yamlJSON → YAML

ファイル冒頭の宣言

YAML ファイルにはオプションでバージョン宣言やタグ宣言を書けます。

ディレクティブ説明
%YAML 1.2YAML バージョンを明示
%TAG ! tag:example.com,2026:タグの短縮形を定義
---ドキュメント開始マーカー

実際の運用ではほとんど省略されます。

ベストな書き方の例

ドキュメントヘッダ付きの設定

# config.yaml
# アプリケーション設定。環境ごとに override する。
---
app:
  name: my-app
  version: 1.0.0
  log_level: info

server:
  host: 0.0.0.0
  port: 8080
  read_timeout: 10s
  write_timeout: 10s

database:
  driver: postgres
  host: db.internal
  port: 5432
  name: app
  pool:
    max_open: 25
    max_idle: 5
    max_lifetime: 1h

複数環境を 1 ファイルに

common: &common
  log_level: info
  timeout: 30

environments:
  development:
    <<: *common
    debug: true
    database_url: postgres://localhost/app_dev
  staging:
    <<: *common
    database_url: postgres://staging.db/app
  production:
    <<: *common
    log_level: warn
    database_url: postgres://prod.db/app

Kubernetes に複数リソース

apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  selector:
    app: web
  ports:
    - port: 80
      targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: web
          image: my/web:1.0.0
          ports:
            - containerPort: 8080

エディタ設定のヒント

  • VS Code: redhat.vscode-yaml 拡張機能で YAML Language Server を有効化し、スキーマ検証と補完を有効にする。
  • Vim/Neovim: set expandtab tabstop=2 shiftwidth=2 を ftplugin で設定。
  • EditorConfig を使うとプロジェクト全体で統一できる:
[*.{yaml,yml}]
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

参考リソース

この技術を体系的に学びたいですか?

未来学では東証プライム上場企業のITエンジニアが24時間サポート。月額24,800円から、退会金0円のオンラインIT塾です。

メールで無料相談する
← 一覧に戻る