この用語をシェア
YAMLとは
YAML(YAML Ain't Markup Language)は、人間が読みやすい形式でデータを記述するためのデータシリアライゼーション言語です。「ヤムル」と呼ばれ、インデント(字下げ)を使って階層構造を表現することが特徴です。
2001年に最初の仕様が公開され、名称の「YAML Ain't Markup Language」が示す通り、XMLのようなマークアップ言語ではなく、プログラミング言語のデータ構造(リスト・マップ・スカラー値)を直接表現することを目的に設計されました。中括弧や引用符を極力使わない記法により、設定ファイルを人間が直接読み書きしやすいことが最大の強みです。現在ではDocker、Kubernetes、GitHub Actionsをはじめ、クラウドネイティブ分野のデファクトスタンダードとして定着しています。
YAMLの主要な特徴
- 人間に優しい:直感的で読みやすい構文
- インデントベース:スペースを使ったインデントで階層構造を表現(タブは使用不可)
- 軽量:中括弧や引用符が少なく、冗長な記述が少ない
- JSON互換:YAML 1.2はJSONのスーパーセットであり、有効なJSONはそのまま有効なYAMLとして解釈できる
- コメント対応:#でコメントを記述可能
基本的な構文
# アプリケーション設定例
application:
name: "IT用語集アプリ"
version: "2.1.0"
author: "野口真一"
# サーバー設定
server:
host: "localhost"
port: 8080
ssl: true
# データベース設定
database:
type: "postgresql"
host: "db.example.com"
port: 5432
credentials:
username: "app_user"
password: "secure_password"
# 機能フラグ
features:
- authentication
- caching
- monitoring
# 環境別設定
environments:
development:
debug: true
log_level: "debug"
production:
debug: false
log_level: "error"
YAMLの主な用途
1. 設定ファイル
アプリケーションの設定、サーバー設定、環境変数などを定義する際の標準的な形式として使用されています。JSONと違いコメントを残せるため、「なぜこの値にしたか」という設計意図をファイル内に記録しながら運用できる点も設定ファイル用途で好まれる理由です。
2. CI/CDパイプライン
GitHub Actions、GitLab CI、Azure DevOpsなどのCI/CDツールで、ワークフローやパイプラインの設定に使用されます。トリガー条件(push、pull_request等)、実行環境、ビルド・テスト・デプロイの各ステップを宣言的に記述できます。
3. Infrastructure as Code (IaC)
Docker Compose、Kubernetes、Ansible、OpenAPIなど、インフラストラクチャやサービスの定義に使用されます。インフラの状態をコードとしてバージョン管理できるため、変更履歴の追跡やレビュー、ロールバックが容易になります。
4. ドキュメント
静的サイトジェネレーター(Jekyll、Hugo)やドキュメント管理システムでメタデータの記述に使用されます。Markdownファイルの先頭に埋め込む「フロントマター」もYAML形式で書かれることが一般的で、タイトル・公開日・タグといった記事のメタ情報を管理するのに使われます。
YAMLのデータ型
基本型
# 文字列
title: "YAMLの解説"
description: YAMLは便利な言語です
# 数値
port: 8080
version: 1.2
# 真偽値
enabled: true
debug: false
# null
value: null
empty: ~
配列・リスト
# 配列形式1
technologies:
- YAML
- JSON
- XML
# 配列形式2
skills: ["AWS", "Docker", "Kubernetes"]
オブジェクト・マップ
# オブジェクト
person:
name: "野口真一"
role: "エンジニア"
skills:
- AI
- AWS
- フリーランス
YAML・JSON・XMLの比較
| 項目 | YAML | JSON | XML |
|---|---|---|---|
| 可読性 | 非常に高い | 高い | 高い(やや冗長) |
| コメント | 対応(#) | 非対応 | 対応(<!-- -->) |
| パース速度 | やや遅い | 速い | やや遅い(DOM解析時) |
| ファイルサイズ | 小さい | やや大きい | 大きい(タグの冗長性) |
| ブラウザサポート | ライブラリ必要 | ネイティブサポート | ネイティブパーサーあり |
| 主な用途 | 設定ファイル、CI/CD定義 | Web API、データ交換 | 文書管理、SOAP、EDI |
YAMLのメリット・デメリット
メリット
- 波括弧や引用符が最小限で済み、Kubernetesマニフェストのような長大な設定でも見通しが良い
- アンカー(&)とエイリアス(*)を使うことで、繰り返し登場する設定値を再利用でき、重複記述を減らせる
- コメントを記述できるため、設定の意図を残しながらチームで運用しやすい
- 複数のドキュメントを
---区切りで1ファイルにまとめられる(Kubernetesリソースの一括定義など)
デメリット
- インデントに意味を持たせるため、タブとスペースの混在や桁ずれが構文エラーやロジックの誤りを招きやすい
- 「yes/no」「on/off」などが暗黙的にbooleanと解釈される「Norway Problem」のような予期しない型変換が起こりやすい
- JSONに比べてパース処理が複雑でやや低速なため、大量データの高速な受け渡しには不向き
- 一部のYAMLパーサーには任意コード実行につながる脆弱性があり、信頼できないYAMLを安全でない方法で読み込むとリスクになる
アンカー・エイリアスの例
同じ設定値を複数箇所で使い回したい場合、アンカー(&)とエイリアス(*)が便利です。
# 共通設定をアンカーで定義
defaults: &defaults
adapter: postgresql
host: db.example.com
timeout: 30
# エイリアスで再利用
development:
<<: *defaults
database: myapp_development
production:
<<: *defaults
database: myapp_production
timeout: 60
この例では&defaultsで定義した内容を*defaultsで参照し、<<(マージキー)で展開しています。共通設定を一箇所にまとめられるため、複数環境の設定ファイルで重複を減らすのに役立ちます。
YAMLの注意点
1. インデントの重要性
YAMLはインデントで階層を判断するため、スペースとタブの混在やインデント数のミスはエラーの原因となります。同じ階層の要素は必ず同じ数のスペースで揃える必要があり、エディタの自動フォーマット機能やLinterを併用してミスを防ぐのが実務上のセオリーです。
2. 文字列の扱い
特殊文字を含む文字列はクォートで囲む必要があります。特にコロン(:)を含む場合は注意が必要です。例えばtime: 10:30はコロンがマップの区切りと誤認識される可能性があるため、time: "10:30"のように明示的にクォートで囲むのが安全です。
3. 型の自動判定
YAMLは値の型を自動判定するため、意図しない型変換が起こる場合があります。バージョン番号の3.10が数値として解釈されて3.1に丸められてしまう、あるいはノルウェーの国コードNOがbooleanのfalseと解釈されてしまう、といった事例(Norway Problem)はYAMLパーサーの型推論に起因する典型的な落とし穴として知られています。
人気のYAMLツール
- Docker Compose:複数のコンテナ・ネットワーク・ボリュームの構成をひとつのYAMLファイル(docker-compose.yml)にまとめて定義し、
docker compose upコマンドで一括起動できます。 - Kubernetes:Pod、Deployment、Serviceなどあらゆるリソースの定義をYAMLマニフェストとして記述し、宣言的にクラスタの状態を管理します。
- Ansible:サーバー構築手順を「プレイブック」と呼ばれるYAMLファイルに記述し、複数サーバーへの構成適用を自動化します。
- GitHub Actions:
.github/workflows/配下のYAMLファイルでビルド・テスト・デプロイのワークフローをトリガー条件とともに定義します。 - OpenAPI:REST APIのエンドポイント・パラメータ・レスポンス形式をYAML(またはJSON)で記述し、APIドキュメントの自動生成やクライアントコード生成に利用します。
YAMLの重要性
YAMLは現代の開発・運用において不可欠な技術です。特に以下の分野では必須のスキルとなっています:
- DevOps・インフラ自動化
- コンテナオーケストレーション
- CI/CDパイプライン構築
- クラウドネイティブ開発
- 設定管理
シンプルで読みやすい構文により、技術者だけでなく非技術者も理解しやすく、チーム間のコミュニケーションツールとしても重要な役割を果たしています。
実務での導入時の注意点
- Linterの導入:
yamllintなどのツールをCIに組み込み、インデントミスやフォーマットの不整合をコミット前に検出します。 - 安全な読み込み方法を使う:Pythonの
yaml.safe_load()のように、任意のオブジェクト生成を許さない安全なパース関数を使用し、信頼できないYAMLの読み込みによるコード実行リスクを避けます。 - スキーマ検証の併用:Kubernetesマニフェストなど重要な設定には、JSON Schemaベースのバリデーションツールを併用して構文ミスによる障害を未然に防ぎます。
- 環境ごとの差分管理:アンカー・エイリアスやKustomize、Helmのようなテンプレートエンジンを活用し、開発・検証・本番環境の設定差分を管理しやすくします。
2025〜2026年の最新動向
2025年はKubernetes、GitHub Actions、Terraform等の設定ファイルでYAMLが事実上の標準に。YAML 1.2仕様の準拠とAIによるYAML設定ファイルの自動生成・検証も進んでいます。
よくある質問(FAQ)
Q. YAMLとは?
A. YAML(YAML Ain't Markup Language)は、人間に読みやすいデータシリアライゼーション言語です。インデントで構造を表現し、設定ファイル(Docker Compose、Kubernetes、GitHub Actions等)で広く使われています。
Q. YAMLとJSONの違いは?
A. YAMLはコメント記述可能、アンカー・エイリアスによる参照、人間に読みやすい記法が特徴。JSONはパースが高速でWebAPI通信に最適。設定ファイルにはYAML、データ交換にはJSONが一般的です。
Q. YAMLで注意すべき点は?
A. インデントの不整合(タブ使用不可)、暗黙的な型変換(yes/noがbooleanに)、マルチラインの扱い、セキュリティ(任意コード実行の脆弱性があるパーサーも)に注意が必要です。
Q. YAMLでタブは使えますか?
A. YAML仕様ではタブ文字によるインデントは許可されていません。必ずスペースでインデントを揃える必要があり、多くのエディタでは自動的にタブをスペースへ変換する設定を推奨しています。
Q. アンカー・エイリアスとは何ですか?
A. アンカー(&)で定義した値をエイリアス(*)で再利用できるYAMLの機能です。複数の環境で共通する設定値をまとめて管理でき、記述の重複を減らせます。
