YAMLアンカーとエイリアス(JSON等価物なし)

YAMLのアンカー(&)とエイリアス(*)で再利用可能な設定ブロックを作る方法を学びます。JSON形式への変換時にこれらがどのように展開されるかを理解します。

Advanced

詳細な説明

YAMLのアンカーとエイリアスは設定ファイルでの繰り返しを避けるための強力な機能です。JSONには直接的な等価物がなく、JSONに変換する際、アンカーは完全な値に展開(デリファレンス)されます。

アンカーとエイリアスを使ったYAML:

defaults: &default_settings
  timeout: 30
  retries: 3
  log_level: info

development:
  <<: *default_settings
  log_level: debug
  database: dev_db

staging:
  <<: *default_settings
  database: staging_db

production:
  <<: *default_settings
  retries: 5
  database: prod_db

JSONに変換(アンカーが完全に展開):

{
  "defaults": {
    "timeout": 30,
    "retries": 3,
    "log_level": "info"
  },
  "development": {
    "timeout": 30,
    "retries": 3,
    "log_level": "debug",
    "database": "dev_db"
  },
  "staging": {
    "timeout": 30,
    "retries": 3,
    "log_level": "info",
    "database": "staging_db"
  },
  "production": {
    "timeout": 30,
    "retries": 5,
    "log_level": "info",
    "database": "prod_db"
  }
}

仕組み:

  1. &anchor_name はアンカー(再利用可能なデータブロック)を定義します。
  2. *anchor_name はアンカーを参照(データを挿入するエイリアス)します。
  3. <<: はマージキーで、参照されたマッピングを現在のマッピングにマージします。
  4. オーバーライド値はマージキーの後に配置すると優先されます。例では、developmentlog_levelinfo から debug にオーバーライドしています。

アンカーはシーケンスでも機能:

shared_ports: &ports
  - 80
  - 443

service_a:
  ports: *ports
service_b:
  ports: *ports

主な制限事項:

  • アンカーはドキュメントスコープで、他のYAMLファイルの値を参照できません。
  • JSONからYAMLへの変換では、どの値が元々共有されていたか分からないためアンカーを再作成できません。
  • 一部のYAMLパーサーは、Billion Laughs DoS攻撃を防ぐためにアンカーのネスト深度を制限しています。

アンカーは特に、複数の環境が設定の大部分を共有するCI/CD設定で有用です。

ユースケース

タイムアウト、リトライポリシー、ロギング設定などの共通設定を複数のサービス環境で共有し、環境固有のオーバーライドのみを行うDRY(Don't Repeat Yourself)な設定ファイルの保守。

試してみる — JSON ↔ YAML Converter

フルツールを開く