Паттерн: Управление секретами (v3.0.0+)
Этот кейс демонстрирует правила безопасного получения секретов через SecretManager,
включая строгий режим (required=True) и поведение при отсутствии секрета.
Что не так в bad_pattern.py?
-
Прямое чтение из
os.getenv:python token = os.getenv("API_TOKEN")Переменные окружения могут логироваться в CI/CD системах, попадать в дампы процессов или утекать черезprintenv.SecretManagerобеспечивает безопасный и аудируемый доступ. -
Нет проверки на отсутствие секрета:
os.getenvвозвращаетNoneбез предупреждения. Ошибка проявится позже какAttributeError: 'NoneType' object has no attribute...без связи с реальной причиной. -
Захардкоженный fallback в production-коде:
python password = os.getenv("DB_PASSWORD", "admin123")Дефолтный пароль попадёт в репозиторий и будет использован в production если переменная не задана.SecretManagerподдерживает явное разделение dev/production черезrequired. -
Логирование секрета в открытом виде: Передача токена в
print()— прямая утечка в stdout/логи.
Что сделано правильно в good_pattern.py?
-
required=Trueдля production:python secret_mgr.get_secret("api_token", required=True)При отсутствии секрета возбуждаетсяSecretNotFoundErrorс информативным сообщением и hint'ом о том, как установить секрет. Нет молчаливого возвратаNone. -
fallbackтолько для dev/test:python secret_mgr.get_secret("api_token", fallback="dev_token_local")Явно ограничиваем use-case: fallback допустим только вне production. Это читается в коде. -
aget_secretдля async-кода:python await secret_mgr.aget_secret("api_token", required=True)Неблокирующая версия для asyncio-приложений — не блокирует event loop. -
Иерархия хранилищ:
SecretManagerавтоматически ищет секрет в:keyring(системное хранилище) →.envфайл → переменные окружения. На CI/CD keyring заменяется на секреты платформы.
Ключевой совет для ИИ
[!IMPORTANT] Никогда не читайте секреты через
os.getenvв коде приложения. Всегда используйтеSecretManager. В production-окружении всегда указывайтеrequired=True— это гарантирует fail-fast при неправильной конфигурации вместо молчаливой работы с пустым или дефолтным значением.