Tracks
長年にわたり数えきれないほどの構成ファイルを扱ってきましたが、その中でも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バリデータは次のとおりです。
- CLIツール:yamllint(Python製リンター)
- オンラインバリデータ:YAML Lint、JSON FormatterのYAML Validator
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を実践で活かしたい場合は次をご覧ください。
- このMachine LearningのためのCI/CDコースで、CI/CDワークフローにおけるYAMLの使い方を学びましょう。
- このIntroduction to APIs in Pythonコースで、API仕様におけるYAMLの活用を探ってください。
- このContainerization and Virtualizationトラックで、コンテナ化とインフラ自動化をさらに深く学びましょう。
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パーサに無視されるわけではありません。