メインコンテンツへスキップ

YAMLとは何か?基礎・構文・活用事例を理解する

YAMLは、構成、オートメーション、データシリアライゼーションに適したシンプルで強力なフォーマットです。実例とともに仕組みを学びましょう!
更新 2026年8月31日  · 14 分 読む

AIで探索

ChatGPTClaudePerplexity

長年にわたり数えきれないほどの構成ファイルを扱ってきましたが、その中でもYAMLはシンプルさと読みやすさで際立っています。Kubernetesでワークフローを設定するときも、Dockerでサービスを定義するときも、APIリクエストを構造化するときも、YAMLなら複雑な設定をぐっと扱いやすくできます。インデントに基づくクリーンな構造は、XMLのような煩雑さを取り除きつつ、柔軟性も保っています。

このガイドでは、YAMLの構文、構造、発展的な機能、ベストプラクティスを順に解説し、自信を持って扱えるようにお手伝いします。 

YAMLとは?

YAML(Yet Another Markup Language / YAML Ain’t Markup Language)は、可読性と使いやすさを重視したデータシリアライゼーション形式です。HTMLのような入れ子タグを使うXMLや、中括弧と引用符を使うJSON(Pythonの辞書に近い)と比べ、YAMLはより簡潔で、インデントで構造を表すため、人間にとって読みやすいのが特徴です。

YAMLは、スカラー(文字列、数値、ブール)、シーケンス(リスト)、マッピング(キーと値の組)といったさまざまなデータ型をサポートします。構成ファイル、インフラ自動化、データ交換で広く使われており、特にKubernetes、Docker、Ansibleのようなツールで重用されています。

さらに、YAMLはJSONのスーパーセットであり、有効なJSONファイルはYAMLとしてもパースできます。YAMLファイルの拡張子は一般的に.yamlまたは.ymlです。

詳しくは公式サイトもご覧ください。

YAMLの構文と構造

このセクションでは、キーと値の組、リスト、入れ子データ、コメントなど、YAML構文の基本原則を解説します。

基本的な構文ルール

YAMLにはいくつかの基本ルールがあります。 

  • スペースのインデントで構造を表します。タブは使わないでください。 
  • キーと値の組は、他の言語と同様にkey: valueの形式です。 
  • 行頭のハイフンはリストを表します。 
  • #はコメント行を作成します。
# Here is an example of YAML
name: John Doe
age: 30
skills:
  - Python
  - YAML

キーと値の組

YAMLは、Pythonの辞書のようにデータをキーと値の組で表します。これは、多様な構成ファイルや設定に与える情報を表すのによく使われます。文字列やキーを引用符で囲む必要はなく、必要なキーと値を書くだけで構いません。

location: New York
country: USA
security-level: user

YAMLのリスト

リストはハイフン(-)で表します。1つのキーの下に複数の要素を列挙できます。マークアップエディタで読むと視覚的には箇条書きのように表示されることがあります。

fruits:
  - Apple
  - Banana
  - Cherry

入れ子データ

入れ子構造は、インデントを使って階層的なデータ表現を可能にします。入れ子の辞書のように考えると理解しやすいでしょう。インデントで、どのキーが他のキーの下位集合かを示します。

person:
  name: Alice
  details:
    age: 25
    city: London

コメント

#で始まるコメントは、YAMLパーサに無視されます。コメントは1行コメントです。

# This is a comment
username: admin
password: secret

YAMLの高度な機能

YAMLには、複数行文字列、データ型、アンカーなど、ドキュメントを効率的かつ構造的にする強力な機能があります。ここでは実用的な例とともにこれらの機能を見ていきます。

複数行文字列

YAMLは|(リテラルブロック)と>(折りたたみブロック)で複数行文字列をサポートします。 

  • |(リテラルブロック)は、改行ごとに新しい行\nを作成します。 
  • >(折りたたみブロック)は、連続する改行のみ新しい行にします。
literal: |
  This is a
  multi-line string.

folded: >
  This is another
  multi-line string.

上記は出力を見ると理解しやすいでしょう。

  • |(リテラルブロック)の場合:
This is a
multi-line string.
  • >(折りたたみブロック)の場合:
This is another multi-line string.

YAMLのデータ型

YAMLは、文字列、数値、ブール値、null値など、さまざまなデータ型をサポートします。書式から自動的に型を推測しますが、明示的に型を指定することもできます。

次の例は、YAMLにおける基本的なデータ型の使い方を示しています。

string_implicit: Hello, YAML!  # No quotes needed unless necessary
string_double_quoted: "Supports escape sequences like \n and \t"
string_single_quoted: 'Raw text, no escape sequences'

integer: 42  # Whole numbers
float: 3.14  # Numbers with decimals

boolean_true: true
boolean_false: false

null_value: null  # Null value
null_tilde: ~  # Another way to represent null

必要に応じて、!!typeで明示的に型を宣言できます。

explicit_string: !!str 123  # Forces 123 to be a string
explicit_integer: !!int "42"  # Forces "42" to be an integer
explicit_float: !!float "3.14"  # Forces "3.14" to be a float

YAMLは構造化データに使われることが多いため、次のような構造もサポートします。

  • リスト(シーケンス):
fruits:
  - Apple
  - Banana
  - Cherry
  • 辞書(マッピング):
person:
  name: Alice
  age: 30
  is_student: false

アンカーとエイリアス

YAMLでは、アンカー(&)で再利用可能な値を定義し、エイリアス(*)で参照できます。これにより構成ファイルの冗長性を減らし、よりクリーンで保守しやすくなります。

defaults: &default_settings
  retries: 3
  timeout: 30

server1:
  host: example.com
  retries: *default_settings  # Reuses the retries value from defaults

<<:構文を使うと、アンカーから別のマッピングにキーと値の組をマージできます。両方に同じキーがある場合は、新しい値が元の値を上書きします。

defaults: &default_settings
  retries: 3
  timeout: 30

server1:
  <<: *default_settings  # Merges all key-value pairs from default_settings
  host: example.com  # This key is added to the merged data

最終的に解決された構造は次のとおりです。

server1:
  retries: 3
  timeout: 30
  host: example.com

アンカーとエイリアスは、値の繰り返しが非効率になる大規模な構成ファイルで特に有用です。DRY(Don't Repeat Yourself)の原則を保ち、更新を容易にします。

YAMLの一般的なユースケース

YAMLは、ソフトウェア開発、インフラ自動化、API管理で広く使われています。人間が読みやすい構文により、構成ファイル、データシリアライゼーション、Infrastructure as Code(IaC)の形式として好まれます。ここでは代表的な用途を見ていきます。

構成ファイル

YAMLはDocker Compose、Kubernetes、およびCI/CDパイプラインのようなアプリケーションの構成で広く使われています。理解しやすいため、DockerのYAMLセットアップファイルを誰でも手早く読み取り、何が起きているかを把握できます。

version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"
    environment:
      - NGINX_HOST=localhost
      - NGINX_PORT=80

YAMLの読みやすさと、アンカーやエイリアスのサポートは、繰り返しを減らし、JSONやXMLよりも保守しやすくします。

DockerにおけるYAMLの使い方については、この中級Dockerコースで学べます。

データのシリアライゼーションと転送

YAMLは、複雑なデータ構造を人間が読みやすく、かつ機械が容易にパースできる形式に変換することで、APIや構成管理ツールのデータシリアライゼーションに使われます。 

たとえば、YAMLで整形されたAPIリクエストボディは次のとおりです。

user:
  id: 123
  name: "John Doe"
  email: "johndoe@example.com"
  active: true

YAMLはインデントベースの構造により不要な記法を排し、JSONと比べて軽量で読みやすく、修正しやすいのが利点です。

Infrastructure as Code(IaC)

AnsibleやKubernetesのような構成管理ツールは、システム状態の定義、プロセスの自動化、環境間の一貫性確保にYAMLを活用しています。

  • Ansibleでは、システム状態、タスク、依存関係を定義するプレイブックをYAMLで記述し、インフラ構成の一貫性を担保します。 
  • Kubernetesでは、Pod、Service、Deploymentなどのリソースを定義するマニフェストにYAMLを用い、コンテナ化アプリのオーケストレーションを自動化します。

以下はKubernetesのPod構成の例です。

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
    - name: app-container
      image: my-app:latest
      ports:
        - containerPort: 8080

KubernetesにおけるYAMLの使い方は、Introduction to Kubernetesコースで学べます。

APIドキュメンテーション

例えば OpenAPI や Swagger のようなAPI仕様は、エンドポイントやデータ構造を読みやすく定義するためにYAMLを使用します。APIメソッド、リクエストパラメータ、レスポンス形式、認証方法などの概要をYAMLで記述します。

以下はYAMLで記述したOpenAPI仕様の例です。

openapi: 3.0.0
info:
  title: User API
  version: "1.0"
paths:
  /users:
    get:
      summary: Retrieve a list of users
      responses:
        "200":
          description: Successful response

OpenAPI仕様は、RESTful APIをドキュメント化するためにYAMLを用います。これにより、クライアントSDKの生成、インタラクティブなAPIドキュメント、テスト自動化のための明確な設計図を提供できます。この構造化された形式により、API実装間の一貫性が保たれます。

YAMLファイルの扱い方

YAMLは構成ファイル、オートメーション、データシリアライゼーションで広く使われますが、インデントに依存するため、正しい書式が重要です。ここでは、YAMLを効果的に読み取り、書き込み、検証、編集する方法を説明します。

PythonでYAMLを読み書きする

PythonのPyYAMLライブラリは、YAMLのパースと生成ができます。

次のような構成YAMLファイルがあるとします。

database:
  host: localhost
  port: 5432
  user: admin
  password: secret

この構成ファイルをPythonで扱う方法は以下のとおりです。

import yaml

# Load YAML data
with open("config.yaml", "r") as file:
    data = yaml.safe_load(file)  # safe_load prevents arbitrary code execution

# Modify data (optional)
data["database"]["user"] = "new_user"

# Write YAML data
with open("output.yaml", "w") as file:
    yaml.dump(data, file, default_flow_style=False)

PythonでのJSONデータの扱いに興味があれば、包括的なPython JSONチュートリアルをご覧ください。

YAMLファイルの検証

正しい構造を確保するため、スペースの代わりにタブを使っていないか、重複文字、構文エラー、行末の余分なスペースといった問題を検出するツールを利用できます。

代表的なYAMLバリデータは次のとおりです。

YAMLの編集

YAMLは任意のテキストエディタで作成・編集できますが、リンターやシンタックスハイライトを使うと可読性が向上します。

おすすめのエディタ:

  • VS Code(YAMLプラグイン併用)
  • PyCharm(標準サポート)
  • Sublime Text(YAMLシンタックスハイライト)

YAMLで避けたいよくあるミス

YAMLはシンプルですが、使っているとミスやタイプミスは起こりがちです。このセクションでは、よくある間違いを取り上げ、正しくクリーンなファイルを書くためのベストプラクティスを紹介します。リンターや対応したテキストエディタの利用を勧める理由もここにあります。

タブとスペースの混在

YAMLはインデントにスペースを使います。タブとスペースを混在させてはいけません。タブはYAMLを壊します。これは意図的な設計で、システムによってタブの解釈が異なるため、影響を最小化する目的でスペースが推奨されています。

不適切なインデント

パースエラーを避けるため、インデントを一貫させてください。インデントはYAMLが階層を表す唯一の方法であるため、誤ったパースはコードに問題を引き起こします。key: valueの組を誤った場所に入れ込んでしまうのはよくあるので、インデントに注意を払いましょう。

特殊文字に引用符を付け忘れる

特殊文字やスペースを含む文字列には引用符を使ってください。バックスラッシュ、カンマ、感嘆符などは、文字列として解釈させるために引用符が必要です。

path: "/home/user/documents"
message: "Hello, World!"

適切な検証、整理された編集、そしてPythonのPyYAMLを活用すれば、YAMLファイルを効率よく扱い、よくある落とし穴も避けられます。

まとめ

YAMLは、構成、データシリアライゼーション、インフラ自動化で広く使われる、強力でありながらシンプルな形式です。構文、構造、ベストプラクティスを理解すれば、さまざまな場面でYAMLを効率的に活用できます。

YAMLを実践で活かしたい場合は次をご覧ください。

FAQs

YAMLは普遍的ですか?

データの送受信先がYAMLを読み取れるのであれば、YAMLは有効かつ有用なシリアライズと転送の手段です。送信先がYAMLを処理できることを必ず確認してください。

YAMLは安全ですか?YAMLファイルでセキュリティリスクが生じることはありますか?

YAML自体は単なるデータ形式ですが、信頼できないYAMLファイルをパースする際にセキュリティリスクが生じます。PythonのPyYAMLにおける既定のyaml.load()は、YAML内に埋め込まれた任意コードを実行する可能性があり危険です。代わりに、悪意あるコードの意図しない実行を防ぐため、常にyaml.safe_load()を使用してください。同様に、アプリケーションでYAMLを使用する際は、厳格なスキーマ検証を行い、脆弱性を避けましょう。

YAMLは環境変数をサポートできますか?

はい。YAML自体が環境変数を直接処理するわけではありませんが、多くのツール(Docker ComposeやKubernetesなど)がYAML内で環境変数を参照できるようにしています。

YAMLでコメントはどのように扱いますか?

YAMLは#による1行コメントをサポートしますが、複数行コメントはサポートしていません。複数行コメントが必要な場合は、_commentのようなダミーキーを使うのが一般的な回避策です。ただし、これはあくまで慣習であり、アプリケーションが特別にフィルタリングしない限り、YAMLパーサに無視されるわけではありません。

トピック
データエンジニアリング

これらのコースでデータエンジニアリングをさらに学びましょう!

Tracks

データエンジニア Pythonで

40時間
需要の高いスキルを身につけ、データを効率的に取り込み、クレンジングし、管理し、パイプラインをスケジュールして監視できるようになり、データエンジニアリング分野で差をつけましょう。
詳細を見るRight Arrow
コースを開始
もっと見るRight Arrow