RunToolz iconRunToolz
Welcome to RunToolz!
YAML設定DevOps

YAML:雑然さのない設定ファイル

なぜYAMLが設定ファイルの標準になったか、そして落とし穴を避ける方法。

RunToolz Team2026年1月16日4 min read

すべてのKubernetesマニフェスト。すべてのGitHub Actionsワークフロー。すべてのDocker Composeファイル。

YAMLは設定のあらゆる所にあります。読みやすく、柔軟で、驚くべき癖があります。

なぜYAML?

JSONは厳格:ダブルクォート、コメントなし、末尾カンマなし。

YAMLは寛容:最小限の構文、コメント可、人間が読める。

# YAML設定
database:
  host: localhost
  port: 5432
  name: myapp
{
  "database": {
    "host": "localhost",
    "port": 5432,
    "name": "myapp"
  }
}

同じデータ、YAMLではより少ないノイズ。

実際に試してみませんか?YAMLをJSONに変換

基本

キーバリューペア:

name: John
age: 30

ネスト構造(スペース使用、タブじゃない):

person:
  name: John
  age: 30

リスト:

colors:
  - red
  - green
  - blue

インラインリストとオブジェクト:

colors: [red, green, blue]
person: {name: John, age: 30}

ノルウェー問題

country: NO

NO は何?ブール値 false。YAMLは NOYesonoffなどをブール値として解釈。

ノルウェーの国コードが false になります。設定が謎の方法で壊れます。

修正: ブール値と解釈されうる文字列をクォート。

country: "NO"

複数行文字列の問題

description: This is a long
  description that continues

これは2行ですか、それとも「that continues」がインデントされた1行?YAMLパーサーによります。

明示的な複数行:

# リテラル(改行を保持)
description: |
  Line one
  Line two

# 折りたたみ(行を結合)
description: >
  This is one long
  line when parsed

インデントが重要

2スペース。タブじゃない。1スペースじゃない。3スペースでもない。

# 正しい
parent:
  child: value

# 間違い - タブ文字
parent:
	child: value

タブとスペースの混在はYAMLを静かに壊します。エディタをスペース使用に設定しましょう。

数値の解釈

version: 1.10

これは文字列「1.10」ですか、それとも数値1.1?ほとんどのパーサーは1.1と解釈。

浮動小数点数学が再び襲います。バージョン番号をクォートしましょう。

version: "1.10"

アンカーとエイリアス

YAMLは繰り返しコンテンツを参照できます:

defaults: &defaults
  timeout: 30
  retries: 3

production:
  <<: *defaults
  timeout: 60

重複削減には強力。やりすぎると混乱。

YAMLの検証

YAMLの柔軟性は見た目が有効な多くのものが実際は無効であることを意味します。

  • エディタでリンターを使う
  • 可能な時はスキーマに対して検証
  • パーサーが実際に何を解釈したかを見るためにJSONに変換

設定が機能していないなら、書いたものではなくパーサーが何を見ているかチェック。

YAML vs JSON vs TOML

YAML: 人間が読める、多くの機能、癖のあるエッジケース。

JSON: 厳格、シンプル、広くサポート、冗長。

TOML: 明示的、驚きが少ない、設定で人気上昇中。

マシン間データには、JSONの方が安全。人間編集の設定には、落とし穴を知っていればYAMLが機能。


YAMLは厳格さより可読性を優先。そのトレードオフがエッジケースを作ります。ブール値や数値に見える文字列をクォートし、明示的な複数行構文を使い、デプロイ前に検証しましょう。