ENV変数展開とYAMLリファレンス
.envファイルの環境変数展開($VAR、${VAR})とYAMLアンカー・エイリアスを比較します。2つの形式間で参照パターンがどのように異なるかを学びます。
詳細な説明
ENVとYAMLはどちらも値の参照形式をサポートしていますが、動作は大きく異なります。ENVはシェルスタイルの変数展開を使用し、YAMLはアンカーとエイリアスを使用します。適切な変換のためには、両方を理解することが重要です。
変数展開を含むENVファイル:
# 基本設定
DB_HOST=localhost
DB_PORT=5432
DB_USER=admin
DB_PASSWORD=secret123
DB_NAME=myapp
# 変数展開を使用した合成URL
DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}
# 派生値
APP_TITLE=MyApp
FULL_TITLE=${APP_TITLE} - Production
LOG_FILE=/var/log/${APP_TITLE}/app.log
展開後の値:
DATABASE_URL=postgres://admin:secret123@localhost:5432/myapp
FULL_TITLE=MyApp - Production
LOG_FILE=/var/log/MyApp/app.log
アンカーを使用したYAML対応(異なるパラダイム):
db:
host: &db_host localhost
port: &db_port 5432
user: &db_user admin
password: &db_password secret123
name: &db_name myapp
# YAMLはENVのようにアンカーから文字列を合成できません。
# これが最も近い対応です:
database_url: "postgres://admin:secret123@localhost:5432/myapp"
app:
title: MyApp
full_title: "MyApp - Production"
log_file: /var/log/MyApp/app.log
主な違い:
ENV展開は文字列補間です。
${DB_HOST}は別の文字列内でDB_HOSTのリテラル値に置き換えられます。これによりURLのような合成値を構築できます。YAMLアンカーは値参照です。
*anchorはアンカーされた値全体を挿入しますが、文字列内では使用できません。YAMLにはネイティブの文字列補間がありません。展開のタイミング。 ENV変数はシェルまたはdotenvライブラリによりパース時に展開されます。YAMLアンカーはYAMLパーサーにより解決されます。
ENV展開をYAMLに変換する方法: YAMLには文字列補間がないため、2つの選択肢があります:
- すべての値を事前展開する -- すべての
${...}参照を解決し、最終値をYAMLに書き込む。 - アプリケーションレベルのテンプレートを使用する -- Helm(Goテンプレート)、Ansible(Jinja2)、envsubstなどのツールがYAML上に変数展開を提供できる。
YAMLアンカーをENVに変換する方法: YAMLアンカーはYAML-to-ENV変換時に完全に展開されます。ENVには参照の概念がないためです。マージ/参照された値は直接書き込まれます。
変数展開構文のバリアント:
$VAR # シンプルな展開(一部のパーサー)
${VAR} # ブレース付き展開(最も一般的)
${VAR:-default} # VARが未設定の場合のデフォルト値
${VAR:?error} # VARが未設定の場合にエラー
すべてのdotenvライブラリがすべての展開形式をサポートしているわけではありません。特定のランタイムでテストしてください。
ユースケース
データベースURLやAPIエンドポイントを構築するために変数展開を多用している.envファイルから、Helmチャート用のYAML設定ファイルに移行する際、すべての値を事前展開する必要がある場合。