ENV変数展開とYAMLリファレンス

.envファイルの環境変数展開($VAR、${VAR})とYAMLアンカー・エイリアスを比較します。2つの形式間で参照パターンがどのように異なるかを学びます。

Advanced Patterns

詳細な説明

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

主な違い:

  1. ENV展開は文字列補間です。 ${DB_HOST}は別の文字列内でDB_HOSTのリテラル値に置き換えられます。これによりURLのような合成値を構築できます。

  2. YAMLアンカーは値参照です。 *anchorはアンカーされた値全体を挿入しますが、文字列内では使用できません。YAMLにはネイティブの文字列補間がありません。

  3. 展開のタイミング。 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設定ファイルに移行する際、すべての値を事前展開する必要がある場合。

試してみる — YAML ↔ ENV Converter

フルツールを開く