用語辞典・クラウド・開発運用

YAML

YAMLとは

YAML(YAML Ain't Markup Language/ヤムル)は、インデントを使い、設定やデータ構造を人が読み書きしやすい形で表すテキスト形式です。名称は自分自身を含む再帰的な略称で、公式仕様では英語の「camel」と韻を踏む読み方が示されています。

YAMLは単なる設定ファイルの書式ではなく、Unicodeを使うデータシリアライズ言語です。データを主にmapping(マッピング/対応付け)sequence(シーケンス/順序付きの並び)scalar(スカラー/単一の値)の組み合わせで表し、パーサーがテキストからデータ構造へ読み込みます。

文章に近く見える分、半角スペース、引用符、型の解釈の違いを見落としやすい形式です。インデントにタブは使わず、利用するYAMLのバージョンとアプリケーション固有のスキーマを確認します。

インデントされたテキストをパーサーが読み、三種類のノードへ変換するマッピング・シーケンス・スカラーと、空白・エイリアス・型の解釈を分ける
インデントされたYAMLテキストをパーサーへ通し、鍵と値のマッピング、順序付きのシーケンス、単一値のスカラーへ変換する構造と、半角スペースとタブの違い、アンカーからエイリアスへの参照、型解釈の違いを示すピクトグラム図解
図1図はYAMLの情報モデルを単純化しています。実際の構文記号、エスケープ、スキーマ、バージョンディレクティブは、利用するツールの仕様と合わせて確認します。

三種類のノード

Mapping鍵と値の組

設定名から値を引く構造です。同じマッピング内で鍵を重複させてはいけません。

Sequence順序を持つ並び

複数のサーバー、手順、ポートなどを順番付きの一覧として表します。

Scalar一つの値

文字列、数値、真偽値、null(ヌル)などとして解釈される値です。

Tag値の型を示す

明示的なタグまたはスキーマの規則により、スカラーをどの型として読み込むか決めます。

Anchorノードへ目印を付ける

同じ構造を後から別名で参照し、テキスト上の重複を減らせます。

Documentストリーム内の一単位

一つのストリームに複数文書を置けますが、ツールが対応するか確認します。

最小の構造を読む

service:
  enabled: true
  ports:
    - 443
    - 8443

serviceの値はマッピングで、その内側に二つの鍵があります。portsの値はシーケンスで、各要素は整数として解釈されるスカラーです。

コロンの後ろやダッシュの後ろに必要な空白を入れ、インデントの深さを揃えます。見た目が似ていても、全角スペースは通常のインデント用スペースとして扱われません。

インデントは半角スペースで表す

YAMLではインデントが構造の深さを示します。インデントには半角スペースを使い、タブ文字は使いません。二文字・四文字のどちらを採用するかはプロジェクトで統一し、同じ階層の深さを揃えます。

エディターで不可視文字を表示し、リンターと実際のパーサーで検証します。コピー時にタブや全角スペースへ変わると、人の目では気付きにくいエラーになります。

平文スカラー値と引用

引用符なしの平文スカラー値は簡潔ですが、コロン、ハッシュ、先頭記号、空白、改行、型解決の規則を受けます。文字列として保持したい値は単一引用符または二重引用符で明示します。

単一引用符と二重引用符ではエスケープの扱いが異なります。パス、正規表現、バックスラッシュを含む値を移すときは、対象の処理系で解析した結果を試験します。

型解決の落とし穴

引用符なしの値を文字列、真偽値、数値、nullなどのどれとして読み込むかは、スキーマとバージョンに依存します。YAML 1.1系の慣習を持つパーサーとYAML 1.2では、特定の単語や数値表現の解釈が違うことがあります。

たとえばID、電話番号、日付に見える値は、先頭ゼロの消失やタイムスタンプ化を避けるため、文字列として引用します。アプリケーション側でも期待する型をスキーマで検証します。

複数行スカラー値

リテラルスタイルは改行を保つ用途、折り畳みスタイルは多くの改行を空白へ置き換える用途に使います。末尾改行を保持するか削除するかも記号で変わります。

シェルスクリプト、証明書、Markdown、メッセージ本文を埋める場合は、改行とインデントが実行結果へ影響します。パーサーで読み込んだ後の文字列まで試験します。

アンカーと別名

アンカーでノードに名前を付け、エイリアスから同じノードを参照できます。重複設定の削減に役立ちますが、読み込み後に同じオブジェクトへの参照として扱うか、値の複製として扱うかは言語・ライブラリーにより差があります。

統合鍵は広く使われる一方、YAML 1.2コアの単純な三ノードだけとは別の扱いがあり、すべてのツールで同じとは限りません。可搬性が重要ならアプリケーション側の仕様を優先します。

コメントと順序

コメントは人向けの補足で、通常は読み込んだデータモデルに残りません。解析して再出力すると、コメント、引用符の形式、空行、鍵の順序が変わるライブラリーがあります。

マッピングは意味上、順序を持ちません。表示順に意味を持たせたい場合はシーケンスを使います。ファイル差分を読みやすくするために鍵を並べるのは、運用上の規約です。

JSONとの違い

JSONは波括弧や角括弧を明示し、データ交換で広く使われます。YAMLはコメント、複数行スカラーの表現、アンカーなどを持ち、人が編集する設定に向く一方、構文と型の解釈が複雑です。

YAML 1.2はJSONとの互換性を重視しますが、すべてのYAML文書をJSONへ情報損失なく変換できるとは限りません。タグ、別名、非文字列鍵、コメント、スタイル等が関係します。

安全に読み込む

信頼できないYAMLを、任意のオブジェクト生成やコンストラクター実行を許す安全でないローダーで読んではいけません。安全モード、許可するタグ、サイズ・深さ・別名展開の上限を設定し、ライブラリーを更新します。

別名を大量展開させるリソース枯渇、巨大スカラー値、深い入れ子も考慮します。設定ファイルだから安全とは決め付けません。

YAMLはインデントでデータ構造を表すシリアライズ言語です。マッピング・シーケンス・スカラーを見分け、半角スペース、引用符、スキーマ、バージョン、エイリアス、安全なローダーを確認して初めて意図したデータになります。

YAML 1.2の情報model、mapping・sequence・scalar、schema、syntax:YAML 1.2.2 Specification

関連用語