Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → Конфигурация 12-factor: практика

Конфигурация 12-factor: отделение от кода

Конфигурация 12-factor: отделение конфигурации от кода, переменные окружения, разделение по окружениям и проверка при запуске.

Прямой ответ

Конфигурация 12‑factor отделяет значения от кода, поэтому изменение параметра не требует изменения кода и пересборки приложения.

Принцип Что обеспечивает
Отделение от кода Изменение без пересборки
Переменные окружения Единый способ передачи
Разделение по окружениям Разные значения для разработки и продакшена
Проверка при запуске Обнаружение некорректных значений
from pydantic_settings import BaseSettings

class Settings(BaseSettings):
    database_url: str
    log_level: str = "INFO"
    
    class Config:
        env_prefix = "APP_"

Переменные окружения обеспечивают единый способ передачи конфигурации, поэтому приложение получает значения без изменения кода. Об управлении конфигурацией — в статье про управление конфигурацией.

Отделение от кода и переменные окружения

Конфигурация отделяется от кода, поэтому изменение значения не требует изменения кода и пересборки приложения.

Отделение от кода. Значения хранятся вне кода, поэтому изменение параметра не требует изменения кода и пересборки.

Переменные окружения. Значения передаются через переменные окружения, поэтому единый способ передачи используется для всех окружений.

Разделение по окружениям. Значения разработки, тестирования и продакшена различаются, поэтому окружения разделяются.

Практическое следствие: конфигурация в коде требует изменения кода и пересборки для каждого окружения, поэтому развёртывание усложняется.

Отдельный аспект — проверка при запуске. Некорректное значение обнаруживается до начала обработки, поэтому сбой не возникает после запуска.

Три признака некорректной реализации 12‑factor.

Конфигурация в коде. Изменение значения требует изменения кода и пересборки, поэтому развёртывание усложняется.

Отсутствие разделения по окружениям. Значения разработки и продакшена смешиваются, поэтому компрометация одного затрагивает другое.

Отсутствие проверки при запуске. Некорректное значение обнаруживается во время выполнения, поэтому сбой возникает после запуска.

О переменных окружения — в статье про env‑переменные; о хранении секретов — в статье про секреты в разработке.

Отделение от кода и развёртывание

Отделение конфигурации от кода обеспечивает, что изменение значения не требует изменения кода и пересборки приложения.

Изменение без пересборки. Значения хранятся вне кода, поэтому изменение параметра не требует изменения кода и пересборки.

Единый способ передачи. Переменные окружения обеспечивают единый способ передачи конфигурации для всех окружений.

Разделение по окружениям. Значения разработки, тестирования и продакшена различаются, поэтому окружения разделяются.

Практическое следствие: конфигурация в коде требует изменения кода и пересборки для каждого окружения, поэтому развёртывание усложняется.

Практика: настройка конфигурации 12-factor

1. Отделяйте конфигурацию от кода. Значения хранятся вне кода, поэтому изменение не требует пересборки.

2. Используйте переменные окружения. Единый способ передачи используется для всех окружений, поэтому конфигурация единообразна.

3. Разделяйте конфигурацию по окружениям. Значения разработки, тестирования и продакшена различаются, поэтому окружения разделяются.

4. Проверяйте конфигурацию при запуске. Некорректное значение обнаруживается до начала обработки, поэтому сбой не возникает после запуска.

5. Используйте значения по умолчанию для необязательных параметров. Параметр без значения использует значение по умолчанию, поэтому запуск не прерывается.

6. Фиксируйте источник значения в логе. Источник позволяет определить, откуда получено значение при диагностике.

7. Ограничивайте доступ к конфигурации продакшена. Доступ к значениям продакшена ограничивается, поэтому изменение выполняется контролируемо.

Рекомендации:

  1. Не храните конфигурацию в коде. Изменение значения требует изменения кода и пересборки, поэтому развёртывание усложняется.
  2. Учитывайте разделение по окружениям. Значения продакшена отличаются от разработки, поэтому окружения разделяются.
  3. Сопоставляйте конфигурацию с окружением. Значения продакшена отличаются от разработки, поэтому окружения разделяются.
  4. Фиксируйте источник значения в ошибке. Источник в записи ошибки позволяет определить, откуда получено некорректное значение.
  5. Пересматриваем конфигурацию при изменении окружения. Новое окружение требует разделения значений.

Практический сценарий: изменение конфигурации потребовало пересборки

Контекст: изменение параметра потребовало изменения кода и пересборки приложения, поэтому развёртывание заняло больше времени.

  1. Диагностика. Проверка показала, что значение параметра было задано в коде. Изменение значения потребовало изменения кода и пересборки, поэтому развёртывание заняло больше времени.
  2. Причина. Конфигурация не была отделена от кода, поэтому изменение значения требовало пересборки.
  3. Действия. (а) Вынесли значение в переменную окружения, чтобы изменение не требовало пересборки; (б) настроили разделение по окружениям, чтобы значения разработки и продакшена различались; (в) добавили проверку конфигурации при запуске, чтобы некорректное значение обнаруживалось до сбоя; (г) добавили фиксацию источника значения в логе для диагностики; (д) проверили применение значения после изменения без пересборки.
  4. Результат. Изменение конфигурации не требует пересборки, поэтому развёртывание выполняется быстрее.

Вывод: конфигурация в коде требует изменения кода и пересборки для каждого окружения, поэтому развёртывание усложняется. Отделение конфигурации от кода и использование переменных окружения обеспечивают изменение без пересборки.

Практический сценарий: изменение конфигурации потребовало пересборки

Контекст: изменение параметра потребовало изменения кода и пересборки приложения, поэтому развёртывание заняло больше времени.

  1. Диагностика. Проверка показала, что значение параметра было задано в коде. Изменение значения потребовало изменения кода и пересборки, поэтому развёртывание заняло больше времени.
  2. Причина. Конфигурация не была отделена от кода, поэтому изменение значения требовало пересборки.
  3. Действия. (а) Вынесли значение в переменную окружения, чтобы изменение не требовало пересборки; (б) настроили разделение по окружениям, чтобы значения разработки и продакшена различались; (в) добавили проверку конфигурации при запуске, чтобы некорректное значение обнаруживалось до сбоя; (г) добавили фиксацию источника значения в логе для диагностики; (д) проверили применение значения после изменения без пересборки.
  4. Результат. Изменение конфигурации не требует пересборки, поэтому развёртывание выполняется быстрее.

Вывод: конфигурация в коде требует изменения кода и пересборки для каждого окружения, поэтому развёртывание усложняется. Отделение конфигурации от кода и использование переменных окружения обеспечивают изменение без пересборки.

FAQ

Что такое конфигурация 12-factor? Подход, при котором конфигурация отделяется от кода и передаётся через переменные окружения. Изменение значения не требует изменения кода и пересборки.

Зачем отделять конфигурацию от кода? Изменение значения не требует изменения кода и пересборки, поэтому развёртывание выполняется быстрее. Конфигурация в коде усложняет развёртывание.

Как разделяется конфигурация по окружениям? Через переменные окружения с разными значениями для разработки, тестирования и продакшена. Окружения разделяются, поэтому компрометация одного не затрагивает другое.

Как проверяется конфигурация при запуске? Проверка типов и обязательных параметров выполняется до начала обработки, поэтому некорректное значение обнаруживается до сбоя.

Источники: 12factor.net, pydantic-settings, Kubernetes ConfigMap — ссылки в шапке.