この記事の要点
• インデントは半角スペースのみ(タブ禁止)、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 |
| Null | value: 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 など一部のパーサではサポートされない場合があるため、利用前に対象パーサを確認してください。
明示的なタグ
タグで型を強制できます。
| タグ | 例 | 説明 |
|---|---|---|
!!int | year: !!int "2026" | 文字列を整数に強制 |
!!float | pi: !!float "3.14" | 文字列を浮動小数に強制 |
!!bool | yes: !!bool "true" | 文字列をブール値に強制 |
!!seq | items: !!seq [1, 2, 3] | シーケンス型を明示 |
!!binary | data: !!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/off | YAML 1.1 でブール扱い。1.2 では文字列だがパーサ依存 |
| 8 進数 | 先頭 0 の数字は 8 進数になる場合あり(YAML 1.1)。文字列として扱うならクォート |
先頭の * | フロー文字列で「エイリアス参照」と誤解されるのでクォート |
| インデント混在 | 同一階層で 2 / 4 スペースを混ぜない |
| タブ | タブ文字は禁止。エディタの設定で半角スペースにする |
| 末尾コロン | key: だけで値がないと null になる |
| 重複キー | 多くのパーサは後勝ち、または警告/エラー |
真偽値の True/TRUE | 1.1 ではブールだが 1.2 ではパーサ次第。小文字 true/false を推奨 |
バリデーションツール
| ツール | 用途 |
|---|---|
yamllint | スタイル/構文チェック |
kubeval / kubeconform | Kubernetes マニフェスト検証 |
actionlint | GitHub Actions の検証 |
python -c "import yaml; yaml.safe_load(open('f.yml'))" | 簡易構文確認 |
yq | jq 風の 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.yaml | YAML → JSON 変換 |
yq -P '.' file.json | JSON → 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 として読み込めます。
| JSON | YAML |
|---|---|
{"a": 1} | a: 1 |
[1, 2, 3] | - 1 / - 2 / - 3 |
"hello" | hello |
true / false / null | true / false / null |
1.5 | 1.5 |
{"k": null} | k: null または k: ~ |
JSON ⇄ YAML 変換は yq で簡単に行えます。
| コマンド | 説明 |
|---|---|
yq -o=json '.' input.yaml > output.json | YAML → JSON |
yq -P '.' input.json > output.yaml | JSON → YAML |
ファイル冒頭の宣言
YAML ファイルにはオプションでバージョン宣言やタグ宣言を書けます。
| ディレクティブ | 説明 |
|---|---|
%YAML 1.2 | YAML バージョンを明示 |
%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