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"
}
}
仕組み:
&anchor_nameはアンカー(再利用可能なデータブロック)を定義します。*anchor_nameはアンカーを参照(データを挿入するエイリアス)します。<<:はマージキーで、参照されたマッピングを現在のマッピングにマージします。- オーバーライド値はマージキーの後に配置すると優先されます。例では、
developmentがlog_levelをinfoから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)な設定ファイルの保守。