YAMLの基本構文とは?初心者でもわかる書き方と注意点

プログラミング・IT

「YAML(ヤムル)って何?」
「JSONは知ってるけどYAMLの書き方がよく分からない…」
「Docker Composeで使うけど、いつもコピペで済ませている」

こんな疑問やモヤモヤを抱えていませんか?

YAMLは、プログラムの設定ファイルやデータ定義でよく使われるフォーマットです。特にDocker ComposeやKubernetesの設定など、インフラやDevOpsを触るなら避けて通れません。

この記事では、そんなYAMLの基本構文を中心に、初心者の方でもすぐに書けるようにわかりやすく解説します。

スポンサーリンク

YAMLとは?まずは簡単な説明から

YAMLってどんなもの?

YAMLは「YAML Ain’t Markup Language」の略で、日本語にすると「YAMLはマークアップ言語じゃないんだよ」という少しユーモアのある名前です。

データの階層(構造)を見やすく書くためのフォーマットで、JSONと同じようにデータを表現しますが、人間にとても読みやすいのが特徴です。

JSONとYAMLの比較

同じデータをJSONとYAMLで表現してみましょう:

JSON形式

{
  "name": "山田太郎",
  "age": 30,
  "hobbies": ["読書", "映画鑑賞", "プログラミング"],
  "address": {
    "city": "東京",
    "zip": "100-0001"
  }
}

YAML形式

name: 山田太郎
age: 30
hobbies:
  - 読書
  - 映画鑑賞
  - プログラミング
address:
  city: 東京
  zip: 100-0001

YAMLの方が、カッコや引用符が少なくて読みやすいですね。

どこで使われている?

YAMLは以下のような場面で広く使われています:

  • Docker Composedocker-compose.yml
  • Kubernetesdeployment.yml
  • CI/CDツール(GitHub Actionsなど)のワークフロー定義
  • Ansible の設定ファイル
  • Spring Boot のapplication.yml
  • 静的サイトジェネレーター(JekyllやHugo)の設定

プログラマーだけでなく、サーバーエンジニアや自動化スクリプトを扱う人には欠かせません。

YAMLの基本構文

キーと値(Key-Value)

YAMLの最もシンプルな形は「キー: 値」です。

name: 山田太郎
age: 30
email: yamada@example.com
is_student: false
score: 85.5

重要なポイント

  • コロン(:)の後には必ずスペースが必要
  • 文字列は引用符なしでも書ける
  • 数値、真偽値(true/false)、小数点も使える

配列(リスト)

複数の値は -(ハイフン)で表します。

fruits:
  - りんご
  - バナナ
  - ぶどう

# 一行で書く方法もあります
colors: [赤, 青, 緑]

書き方のコツ

  • ハイフンの後にスペースを入れる
  • インデントを揃える(推奨は2スペース)
  • 短いリストなら一行形式も使える

ネスト(階層構造)

データを階層的に管理する場合、インデント(スペース2つ推奨)で表します。

person:
  name: 山田太郎
  age: 30
  address:
    city: 東京
    zip: 100-0001
    country: 日本
  contact:
    phone: 090-1234-5678
    email: yamada@example.com

階層の作り方

  • 子要素は親要素より深くインデント
  • 同じレベルの要素は同じインデント幅
  • 一般的には2スペースまたは4スペース

配列の中にオブジェクト

実際のプロジェクトでよく使う、配列の中にオブジェクトを含む書き方です:

users:
  - name: 山田太郎
    age: 30
    role: admin
  - name: 田中花子
    age: 25
    role: user
  - name: 佐藤次郎
    age: 35
    role: moderator

よくあるミスと注意点

タブ文字は使用禁止

YAMLはタブ文字をエラーにする仕様です。必ずスペースを使ってください。

# NG: タブでインデント
name:	山田太郎

# OK: スペースでインデント
name: 山田太郎

対処法

  • エディタの設定でタブをスペースに変換
  • VS Codeなら「表示」→「空白文字の表示」で確認

コロンの後のスペース忘れ

次のように書くとエラーになります:

# NG: スペースなし
name:山田太郎

# OK: スペースあり
name: 山田太郎

インデントの不整合

同じレベルの要素は同じインデント幅にする必要があります:

# NG: インデントがバラバラ
person:
  name: 山田太郎
   age: 30
    email: test@example.com

# OK: インデントが揃っている
person:
  name: 山田太郎
  age: 30
  email: test@example.com

特殊文字の扱い

以下の文字を含む場合は引用符で囲みます:

# 特殊文字を含む場合
command: "echo Hello:World"
path: "C:\\Users\\Documents"
message: 'これは"引用"を含みます'

# 複数行の文字列
description: |
  これは複数行の
  文字列です。
  改行も保持されます。

summary: >
  これは長い文章を
  一行にまとめて
  表示したい場合です。

特殊文字一覧

  • : { } [ ] , & * # | > ' " % @ \

実践的な使用例

Docker Composeの例

version: '3.8'
services:
  web:
    build: .
    ports:
      - "8000:8000"
    environment:
      - DEBUG=true
      - DATABASE_URL=sqlite:///db.sqlite3
    volumes:
      - .:/app
    depends_on:
      - db
  
  db:
    image: postgres:13
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

GitHub Actionsの例

name: CI/CD Pipeline
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: 3.9
      - name: Install dependencies
        run: |
          pip install -r requirements.txt
      - name: Run tests
        run: pytest

Kubernetesの例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.20
        ports:
        - containerPort: 80

YAML作成時のベストプラクティス

エディタの設定

VS Code推奨拡張機能

  • YAML Language Support
  • YAML Sort
  • Prettier(フォーマッター)

設定例

{
  "editor.tabSize": 2,
  "editor.insertSpaces": true,
  "editor.detectIndentation": false,
  "[yaml]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode"
  }
}

バリデーション(検証)

オンラインツール

  • YAML Lint(yamlint.com)
  • JSON to YAML Converter

コマンドラインツール

# yamllintのインストール
pip install yamllint

# ファイルの検証
yamllint config.yml

ファイル名の命名規則

一般的な命名パターン:

  • config.yml または config.yaml
  • docker-compose.yml
  • deployment.yaml
  • .github/workflows/ci.yml

どちらの拡張子(.yml / .yaml)でも機能しますが、プロジェクト内では統一しましょう。

トラブルシューティング

よくあるエラーメッセージ

「found character that cannot start any token」

原因: タブ文字を使用している 解決法: すべてスペースに置き換える

「mapping values are not allowed here」

原因: コロンの後のスペース忘れ 解決法: : のようにスペースを追加

「could not find expected ‘:’」

原因: インデントの不整合 解決法: 同じレベルの要素を同じインデント幅に揃える

デバッグのコツ

  1. 段階的に確認: 小さな部分から始めて徐々に拡張
  2. バリデーターの活用: オンラインツールで構文チェック
  3. エディタの支援機能: 構文ハイライトとエラー表示を活用

さらに学習を深めるために

応用的な機能

アンカーとエイリアス(参照)

# アンカーの定義
defaults: &defaults
  timeout: 30
  retries: 3

# アンカーの使用
production:
  <<: *defaults
  host: prod.example.com

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

環境変数の使用

database:
  host: ${DB_HOST}
  port: ${DB_PORT:-5432}  # デフォルト値付き
  name: ${DB_NAME}

次のステップ

YAMLの基本をマスターしたら、以下の分野に挑戦してみましょう:

  1. Docker Compose: 複数のサービスを組み合わせたアプリケーション
  2. Kubernetes: コンテナオーケストレーション
  3. CI/CD: 自動化されたビルドとデプロイ
  4. Infrastructure as Code: TerraformやAnsible

まとめ

YAMLの基本構文をマスターするポイントは以下の通りです:

基本構文

  • キー: 値の形式
  • ハイフン(-)でリスト表現
  • インデントで階層構造

注意点

  • タブ文字は使用禁止(スペースのみ)
  • コロンの後には必ずスペース
  • インデントを正確に揃える
  • 特殊文字は引用符で囲む

実践的なアドバイス

  • エディタの拡張機能を活用
  • オンラインバリデーターで構文チェック
  • 小さな例から始めて徐々に複雑化

コメント

タイトルとURLをコピーしました