Один YAML файл стоимостью несколько миллионов долларов

Есть определенная горькая ирония в том, что один из самых распространенных форматов описания конфигурации в современной инфраструктуре одновременно является и одним из самых коварных источников дорогостоящих ошибок. Формат, который ценится именно за свою читаемость человеком и простоту, парадоксальным образом становится источником проблем именно из-за этой обманчивой простоты, которая создает ложное чувство безопасности там, где на самом деле скрываются серьезные подводные камни. Расскажу несколько историй, обезличенных, но узнаваемых по своей сути, которые хорошо иллюстрируют, как невинно выглядящий текстовый файл превращается в источник многомиллионных потерь. Первая история про конфигурацию автомасштабирования, где значение одного из ключевых параметров было указано без явных кавычек, а сам формат данных интерпретировал это значение совершенно не так, как предполагал автор конфигурации, из-за особенностей автоматического определения типа данных, встроенного в стандарт формата. Разница между тем, что имел в виду человек, и тем, что реально применилось к продакшену, привела к развертыванию кратно избыточного количества вычислительных ресурсов, которые исправно простаивали и накручивали счет от облачного провайдера в течение нескольких недель, прежде чем кто-то заметил аномалию в ежемесячном отчете о расходах. Вторая история связана с банальной опечаткой в отступах, критично важных для этого формата данных, где количество пробелов определяет структуру и иерархию вложенности данных. Незаметный лишний пробел сместил один из блоков конфигурации на уровень выше или ниже предполагаемого, из-за чего важная настройка безопасности, которая должна была применяться к конкретному критичному сервису, фактически оказалась привязана совсем к другому, менее важному компоненту, оставив по-настоящему критичный сервис без должной защиты на протяжении долгого времени, пока эта ошибка случайно не обнаружилась при плановом аудите конфигурации. Третья история касается копирования конфигурации между разными окружениями без должной проверки специфичных для конкретного окружения параметров. Инженер, торопясь развернуть срочное изменение, скопировал файл конфигурации из тестового окружения, забыв заменить один из параметров, указывающий на конкретный внешний ресурс, актуальный для тестового окружения, но совершенно неприменимый для продакшена. В результате критичный производственный сервис в течение нескольких часов пытался обращаться к тестовому ресурсу, который был совершенно не рассчитан на реальную производственную нагрузку, что привело к масштабному сбою в самый неподходящий момент, ожидаемо совпавший с периодом повышенной активности пользователей. Четвертая история, пожалуй, наиболее показательная, касается человеческой психологии восприятия подобных файлов. Именно из за внешней простоты и читаемости этого формата данных многие команды относятся к изменению конфигурационных файлов менее серьезно, чем к изменению обычного программного кода, применяя к ним куда менее строгий процесс ревью, тестирования и постепенного раскатывания изменений, хотя с точки зрения реального влияния на продакшен подобный текстовый файл конфигурации способен нанести ущерб, ничуть не меньший, чем серьезная ошибка в коде самого приложения. Что объединяет все эти истории, так это фундаментальный разрыв между кажущейся простотой формата и реальной сложностью и критичностью того, что этот формат на самом деле описывает. Простота синтаксиса создает обманчивое ощущение, что с подобными файлами можно работать менее аккуратно, чем с полноценным кодом программы, хотя на практике именно эта конфигурация зачастую определяет самые критичные параметры работы всей системы в продакшене. Мой практический совет командам, которые до сих пор относятся к изменению конфигурационных файлов как к чему-то менее серьезному, чем изменение программного кода.