複数行YAMLの値のENV変換

YAML複数行文字列(リテラルブロックとフォールドブロック)をENV形式に変換する際の処理方法を学びます。エスケープ戦略、クォートルール、改行の保持を解説します。

Advanced Patterns

詳細な説明

複数行の値は、YAML-to-ENV変換で最もトリッキーな側面の一つです。YAMLはリテラル(|)とフォールド(>)ブロックスカラーによるエレガントな複数行文字列フォーマットをサポートしていますが、ENVファイルは行指向で、各行が別の変数となります。

複数行の値を持つYAML:

ssl_cert: |
  -----BEGIN CERTIFICATE-----
  MIIBxTCCAWugAwIBAgIJALP2kEZ0gN3vMA
  oGCCqGSM49BAMCMDkxCzAJBgNVBAYTAlVT
  -----END CERTIFICATE-----

welcome_message: >
  Welcome to our application.
  Please read the documentation
  before getting started.

query: |
  SELECT u.name, u.email
  FROM users u
  WHERE u.active = true
  ORDER BY u.created_at DESC;

ENV変換戦略1:ダブルクォート内のエスケープ改行

SSL_CERT="-----BEGIN CERTIFICATE-----\nMIIBxTCCAWugAwIBAgIJALP2kEZ0gN3vMA\noGCCqGSM49BAMCMDkxCzAJBgNVBAYTAlVT\n-----END CERTIFICATE-----"
WELCOME_MESSAGE="Welcome to our application. Please read the documentation before getting started."
QUERY="SELECT u.name, u.email\nFROM users u\nWHERE u.active = true\nORDER BY u.created_at DESC;"

ENV変換戦略2:実際の改行を含むシングルクォート

SSL_CERT='-----BEGIN CERTIFICATE-----
MIIBxTCCAWugAwIBAgIJALP2kEZ0gN3vMA
oGCCqGSM49BAMCMDkxCzAJBgNVBAYTAlVT
-----END CERTIFICATE-----'

各YAMLブロックスタイルが出力に与える影響:

  1. リテラルブロック(| はすべての改行を保持します。各改行はENV値で\nになります。これは証明書、SSHキー、SQLクエリなど、改行が重要な場合に不可欠です。

  2. フォールドブロック(> は行をスペースで結合し、単一行の値を生成します。結果が自然に単一行になるため、ENV変換はよりシンプルです。

  3. チョンピング修飾子|-|+>->+)は末尾の改行を制御します。|-は最後の改行を除去します(通常はENV値で望ましい動作)。|+はすべての末尾改行を保持します。

互換性の懸念:

  • Docker/docker-compose はダブルクォート内のエスケープ改行による複数行ENV値をサポートします。
  • systemd の環境ファイルは複数行の値を全くサポートしません。
  • dotenvライブラリ は異なります:Node.jsのdotenvはダブルクォート内の複数行をサポート、Python dotenvは両方のクォートスタイルでサポートします。
  • シェルのexport はBashでリテラル\nを含む$'...'構文をサポートしますが、すべてのシェルではありません。

推奨: 最大限の移植性のために、ダブルクォートで囲まれた値内でエスケープされた\nを使用してください。証明書やキーの場合は、値全体をBase64エンコードすることも検討してください。

ユースケース

YAMLベースのシークレット管理システムから変換して、DockerコンテナにSSL証明書、SSH秘密鍵、複数行SQLクエリを環境変数として格納する場合。

試してみる — YAML ↔ ENV Converter

フルツールを開く