YAMLを使って設定ファイルを書いていると、同じ内容を何度も繰り返す場面に出会うことがあります。
そんなときに役立つのが「アンカー」と「エイリアス」の機能です。
本記事では、YAMLのアンカー(anchor)の意味・使い方・エイリアスとの関係・DRY原則への応用をわかりやすく解説していきます。
設定ファイルの管理を効率化したい方はぜひ最後までご覧ください。
YAMLのアンカーとは?基本的な意味と仕組み
それではまず、YAMLのアンカーの基本的な意味と仕組みについて解説していきます。
アンカー(anchor)とは、YAMLの特定の値やブロックに「名前」をつけて、別の場所から参照できるようにする機能です。
アンカーは「&名前」で定義し、エイリアス(alias)は「*名前」で参照します。
【アンカーとエイリアスの基本例】
default: &default_settings
timeout: 30
retry: 3
production:
<<: *default_settings # エイリアスでdefault_settingsを展開
timeout: 60 # 上書きも可能
この「<<:(merge key)」を使うことで、アンカーで定義した内容を別のマッピングにマージ(展開)できます。
アンカーとエイリアスを使うことで、同じ設定を何度も書く手間を省きDRYな設定ファイルが作れます。
アンカーとエイリアスの使い方詳細
アンカーとエイリアスの基本的な使い方をさらに詳しく見ていきましょう。
【スカラー値のアンカーとエイリアス】
server: &server_name example.com
backup_server: *server_name # → “example.com” が代入される
【リストのアンカーとエイリアス】
common_tags: &tags
– python
– yaml
project1:
tags: *tags # → [python, yaml] が代入される
スカラー値・リスト・マッピングのいずれもアンカーで定義してエイリアスで参照できます。
エイリアスは参照元の値の「コピー」として展開されます。
マージキー(merge key)の使い方
マージキー「<<:」を使うことで、アンカーで定義したマッピングのキーを別のマッピングに取り込めます。
【マージキーの活用例(環境別設定)】
base_config: &base
database: postgres
port: 5432
debug: false
development:
<<: *base
debug: true # baseのdebugを上書き
production:
<<: *base
host: prod.example.com # 本番環境専用のキーを追加
マージキーを使うと「共通設定は1か所で管理し、環境ごとの差分だけを記述する」というDRY(Don’t Repeat Yourself)な設定管理が実現できます。
アンカーの注意点
アンカーを使う際のいくつかの注意点があります。
同じアンカー名を複数回定義すると、後の定義が上書きされます。
アンカーは定義前に参照することはできません(前方参照不可)。
過度にネストされたアンカーは「Billion Laughs Attack」という脆弱性の原因になるため、外部から受け取ったYAMLをパースする際は安全なパーサーを使うことが重要です。
DRY原則とYAMLアンカーの活用
続いては、DRY原則(Don’t Repeat Yourself)とアンカーの関係を確認していきます。
DRY原則とは「同じ情報を複数の場所に重複して書かない」というソフトウェア開発の重要な原則です。
Docker ComposeでのYAMLアンカー活用例
Docker Composeファイルでのアンカー活用例を見てみましょう。
【Docker ComposeでのアンカーとDRY設定】
x-common: &common
restart: always
networks:
– app_network
environment:
– TZ=Asia/Tokyo
services:
web:
<<: *common
image: nginx:latest
ports:
– “80:80”
api:
<<: *common
image: myapi:latest
この例では、共通設定(restart・networks・environment)を1か所にまとめ、各サービスで再利用しています。
Docker Composeのような複数サービスを管理するファイルでアンカーは特に有用です。
CI/CD設定でのアンカー活用
GitHub ActionsやCircleCIなどのCI/CD設定ファイルでもアンカーは活用されます。
共通のステップ(チェックアウト・キャッシュ・環境変数設定)をアンカーで定義し、複数のジョブで再利用するパターンが典型的です。
ただし、GitHub Actionsは YAML のアンカーを直接サポートしていない部分があるため、ツールの仕様を確認してからアンカーを使う必要があります。
アンカーとエイリアスの代替手段
YAML のアンカーに代わる手段として、Helm(Kubernetesのパッケージ管理ツール)のテンプレート機能・Jinja2テンプレート・Anchorvaluesなどがあります。
複雑な設定管理が必要な場合は、YAMLの機能だけに頼らずテンプレートエンジンを導入することも検討すると良いでしょう。
アンカーを使ったYAML設定ファイルの管理
続いては、アンカーを使ったより実践的な設定ファイル管理のパターンを確認していきます。
環境別設定のDRY管理
開発・ステージング・本番の3環境の設定ファイルを管理する場合、アンカーで共通部分を1か所にまとめることで変更を1か所に集約できます。
たとえばデータベースの接続タイムアウトやリトライ回数など、すべての環境で共通する値をアンカーで定義し、環境固有の設定だけを上書きします。
設定変更の影響範囲を最小化し、メンテナンスを容易にするのがアンカーの最大の価値です。
テストデータでのアンカー活用
YAMLを使ったテストデータでもアンカーは有効です。
共通のベースデータをアンカーで定義し、各テストケースは差分だけを指定するパターンが効率的です。
RubyのRSpecやPythonのpytest、Java のJUnit などのテストフレームワークでYAMLをテストデータとして使う場合に、アンカーを活用することでテストデータの重複を排除できます。
YAMLアンカーのデバッグ方法
アンカーを多用すると設定が複雑になり、デバッグが難しくなることがあります。
yqコマンドや各言語のYAMLパーサーで実際に展開した結果を確認することが重要です。
Pythonでは yaml.dump(yaml.safe_load(yaml_str)) で展開後の YAML を出力して確認できます。
まとめ
本記事では、YAMLのアンカーの意味・エイリアスとの関係・マージキーの使い方・DRY原則への活用・Docker ComposeやCI/CDでの実践例まで詳しく解説しました。
アンカー(&)とエイリアス(*)を使うことで、YAMLファイルで値やブロックを再利用しDRYな設定管理が実現できます。
マージキー(<<:)を組み合わせることで、共通設定を継承しつつ環境ごとの差分を記述するパターンが特に強力です。
アンカーを活用することで、保守性の高いYAML設定ファイルを効率的に管理できます。
ぜひ実際の設定ファイルでアンカーを試してみてください。