ネストされたYAMLキーをENV変数にフラット化する

深くネストされたYAML構造が、ENV互換性のためにアンダースコアまたはダブルアンダースコア区切りを使用して環境変数名にフラット化される仕組みを解説します。

YAML to ENV

詳細な説明

ネストされたYAML構造はアプリケーション設定で非常に一般的ですが、ENVファイルは厳密にフラットです。変換には、階層情報を変数名に保持するフラット化戦略が必要です。

ネストされたYAML設定:

server:
  http:
    host: 0.0.0.0
    port: 3000
  https:
    enabled: true
    port: 443
    cert: /etc/ssl/cert.pem
database:
  primary:
    host: db-master.example.com
    port: 5432
    name: myapp
  replica:
    host: db-replica.example.com
    port: 5432

シングルアンダースコア区切りでのフラット化:

SERVER_HTTP_HOST=0.0.0.0
SERVER_HTTP_PORT=3000
SERVER_HTTPS_ENABLED=true
SERVER_HTTPS_PORT=443
SERVER_HTTPS_CERT=/etc/ssl/cert.pem
DATABASE_PRIMARY_HOST=db-master.example.com
DATABASE_PRIMARY_PORT=5432
DATABASE_PRIMARY_NAME=myapp
DATABASE_REPLICA_HOST=db-replica.example.com
DATABASE_REPLICA_PORT=5432

ダブルアンダースコア区切りでのフラット化:

SERVER__HTTP__HOST=0.0.0.0
SERVER__HTTP__PORT=3000
SERVER__HTTPS__ENABLED=true

区切り文字の慣例:

  1. シングルアンダースコア(_ -- 最も一般的。シンプルで読みやすいですが、元のキー自体にアンダースコアが含まれている場合に曖昧になります(例:database配下のpool_sizeDATABASE_POOL_SIZEとなり、3階層のネストと区別がつきません)。
  2. ダブルアンダースコア(__ -- ASP.NET Core、Django、その他のフレームワークで使用されます。曖昧さを排除します:DATABASE__POOL_SIZEは明確に2階層で、キーにアンダースコアが含まれていることがわかります。
  3. ドット区切り(. -- Spring Boot(server.http.port=3000)で使用されます。シェル環境変数名では有効な文字ではないため、フレームワーク固有のパーサーでのみ動作します。

ネストされたYAMLの配列処理:

allowed_origins:
  - https://example.com
  - https://app.example.com

以下のようにフラット化できます:

ALLOWED_ORIGINS_0=https://example.com
ALLOWED_ORIGINS_1=https://app.example.com
# またはカンマ区切りリストとして:
ALLOWED_ORIGINS=https://example.com,https://app.example.com

区切り文字と配列処理の選択は、ENV変数を消費するフレームワークやツールに依存します。ターゲットプラットフォームのドキュメントを必ず確認してください。

ユースケース

深くネストされたYAML設定ファイル(Kubernetes ConfigMapやHelmのvalues.yamlなど)から、フラットな環境変数のみがサポートされるCI/CDパイプラインで使用するために環境変数を抽出する場合。

試してみる — YAML ↔ ENV Converter

フルツールを開く