Пустая подписка. Горящий дедлайн. Команда, которая до этого Azure в глаза не видела. Вот так выглядел день ноль — а задача звучала просто: собрать инфраструктуру в Azure с нуля. Не демку, не proof of concept. Такой фундамент, который переживёт аудит безопасности, растянется на несколько регионов и пересоберётся из кода быстрее, чем остынет кофе.
Я до сих пор помню тот первый terraform apply по пустой подписке. Ресурсы появляются в реальном времени, каждый — решение, зашитое в код. Одновременно захватывающе и страшно. Но до этого момента мы дошли позже, чем всем хотелось.
Три дня у доски — и ни строчки Terraform
Все рвались писать код в первый же день. Я сказал: нет.
Три дня мы занимались только сетью. Только дизайном сети. Hub-spoke топология, сегментация по принципу zero trust, цепочки резолва DNS — всё это рисовалось на досках, обсуждалось до хрипоты, стиралось и рисовалось заново. Три дня и ноль строк Terraform. Люди решили, что я тяну время.
Через три недели, когда каждый модуль лёг ровно в ту топологию, что мы набросали, — думать так перестали. Эти три дня дизайна сэкономили недели три переделок дальше по проекту. Лучшая сделка за весь проект.
Требования не обсуждались
Это была не контора в стиле «давайте быстро наговнокодим, а потом разберёмся». Ограничения зафиксировали ещё до меня:
- Multi-region HA по availability zones — никаких единых точек отказа.
- Zero trust как реальный дизайн сети, а не слайд в презентации.
- 100% Terraform — никаких кликов по порталу, вообще никаких.
- Hub-spoke топология, потому что плоская сеть в энтерпрайзе — это инцидент безопасности, который терпеливо ждёт своего часа.
Фундамент: модули, landing zones, guardrails
Базовый слой — Terraform-модули под каждый тип ресурса: переиспользуемые, версионированные, покрытые тестами. Поверх — landing zones с subscription vending, чтобы новая команда получала безопасное окружение за часы, а не за недели.
Azure Policy лежала сверху как guardrails: не документация с просьбой вести себя прилично, а правила, которые просто не дают накосячить. И сама инфраструктура ехала через CI/CD pipeline — plan, review, apply. Никто не запускает Terraform с ноутбука. Никогда. Pipeline — единственная дверь.
Безопасность — не «потом допилим»
Безопасность была фундаментом, а не слоем краски, который наносят в конце.
- Private endpoints на всём. Никаких публично торчащих ресурсов в бэкенде.
- NSG-правила под контролем версий и с аудитом — каждое изменение видно и откатывается.
- Key Vault под каждый секрет. Без исключений, без «ну один раз можно».
- RBAC по принципу least privilege, ревью раз в месяц, потому что расползание доступов тихое — ровно до того момента, когда перестаёт быть тихим.
Ошибки, которые били больнее всего
Не буду делать вид, что всё прошло гладко. Три вещи ужалили по-настоящему.
DNS в hub-spoke — это отдельный ад. Я его недооценил, а ведь it's always DNS. Private DNS zones, форвардеры, условный резолвинг между споками — заложишь поздно, будешь дошивать через боль.
Дефолты Azure небезопасны. Совсем. Считать иначе — верный способ потом объяснять security-команде, откуда взялся публичный storage account.
Governance, прикрученный задним числом, — это governance, который ты выдираешь и переделываешь. Тоже проверили на своей шкуре. Либо закладываешь с первого дня, либо закладывай время на переделку.
Infrastructure as code, а не infrastructure as hope
Подписка, которая начиналась пустой, в итоге получила multi-region HA по availability zones, private endpoints на каждом ресурсе и полный путь пересборки из кода — меньше чем за час.
И вот это последнее — суть всего. Если твою инфраструктуру в Azure нельзя пересобрать из кода меньше чем за час, у тебя не infrastructure as code. У тебя infrastructure as hope — инфраструктура на честном слове.
Облако — это не магия. Это инженерия с кредиткой в руках. Архитектурные решения, которые ты принимаешь в первые три дня — до того, как кто-то напишет строку Terraform, — и определяют, строишь ты платформу или мину замедленного действия.
Так что оставлю вопрос: сколько времени вы реально тратите на дизайн, прежде чем написать первую строку кода?