Python YAML設定からENV変数への変換

Pythonアプリケーション(Django、Flask、FastAPI)のYAML設定を環境変数に変換します。django-environパターンとpython-dotenvの互換性を解説します。

Real-World Configs

詳細な説明

Pythonウェブフレームワークは、開発時にはYAMLを、本番環境では環境変数を設定に使用するのが一般的です。これらの間の変換には、フレームワーク固有の規約とPythonの型変換パターンの理解が必要です。

Django settings.yml(PyYAMLで読み込み):

django:
  secret_key: "django-insecure-dev-key-change-me"
  debug: true
  allowed_hosts:
    - localhost
    - 127.0.0.1
    - ".example.com"
database:
  engine: django.db.backends.postgresql
  name: myproject
  user: postgres
  password: localpass
  host: localhost
  port: 5432
cache:
  backend: django.core.cache.backends.redis.RedisCache
  location: "redis://localhost:6379/1"
email:
  backend: django.core.mail.backends.smtp.EmailBackend
  host: smtp.gmail.com
  port: 587
  use_tls: true
  host_user: "user@example.com"
  host_password: "app-password"

対応する.envファイル(django-environ用):

# Django core
DJANGO_SECRET_KEY=django-insecure-dev-key-change-me
DJANGO_DEBUG=True
DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1,.example.com

# Database(django-environはDATABASE_URLパターンを使用)
DATABASE_URL=postgres://postgres:localpass@localhost:5432/myproject

# Cache(django-environ URLパターン)
CACHE_URL=redis://localhost:6379/1

# Email
EMAIL_BACKEND=django.core.mail.backends.smtp.EmailBackend
EMAIL_HOST=smtp.gmail.com
EMAIL_PORT=587
EMAIL_USE_TLS=True
EMAIL_HOST_USER=user@example.com
EMAIL_HOST_PASSWORD=app-password

Python固有の変換における注意点:

  1. django-environのURLパターン。 個別のhostportuserpasswordnameキーの代わりに、django-environは単一のURLを使用します: DATABASE_URL=postgres://user:pass@host:port/dbname。これはよりコンパクトですが、粒度が失われます。

  2. ブール値の規約。 PythonのTrue/Falseの大文字表記は、Python向けのENVファイルでよく使用されます(他のエコシステムでの小文字true/falseとは異なる)。django-environライブラリはどちらも受け入れます。

  3. リストの処理。 DJANGO_ALLOWED_HOSTS=localhost,127.0.0.1env.list('DJANGO_ALLOWED_HOSTS')でカンマ区切りでパースされます。

  4. django-environによる型キャスト:

import environ
env = environ.Env(
    DEBUG=(bool, False),           # boolにキャスト、デフォルトFalse
    EMAIL_PORT=(int, 587),         # intにキャスト、デフォルト587
    ALLOWED_HOSTS=(list, []),      # listにキャスト、デフォルト空
)

Flask/FastAPI対応:

# Flask config.yml
flask:
  secret_key: dev-key
  sqlalchemy_database_uri: "sqlite:///app.db"
  max_content_length: 16777216
FLASK_SECRET_KEY=dev-key
SQLALCHEMY_DATABASE_URI=sqlite:///app.db
MAX_CONTENT_LENGTH=16777216

主なパターン: Pythonフレームワークは通常、YAMLキー階層にプレフィックスを除外してマッチするUPPER_SNAKE_CASEのENV変数名を期待します(例:django.secret_key -> DJANGO_SECRET_KEYまたは単にSECRET_KEY)。

ユースケース

Heroku、Render、Railwayなどのプラットフォームへのデプロイのために、データベースURL用のdjango-environパターンとシークレット管理を使用して、開発用YAML設定を環境変数に変換してDjangoアプリケーションを準備する場合。

試してみる — YAML ↔ ENV Converter

フルツールを開く