Код Terraform промышленного уровня: почему это долго

Рейтинг: 78.5% · 14 голосов
Подробный курс по Terraform и OpenTofu на примерах Yandex Cloud: ресурсы и провайдеры, состояние и бэкенды, модули, циклы и условия HCL, секреты и Lockbox, тестирование, CI/CD и командная работа. С актуализацией на 2026 (Terraform 1.3-1.10, OpenTofu).
Ответить
Аватара пользователя
Vlad_DevOps
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Код Terraform промышленного уровня: почему это долго

Сообщение Vlad_DevOps »

Оглавление курса (47)
  1. Что такое инфраструктура как код и зачем она нужна
  2. Категории инструментов IaC: чем отличаются Ansible, Packer, Kubernetes и Terraform
  3. Чем Terraform отличается от Ansible, Pulumi и CloudFormation
  4. Как работает Terraform под капотом и кто такой OpenTofu
  5. Установка Terraform и OpenTofu, подготовка Yandex Cloud
  6. Первый ресурс: разворачиваем виртуальную машину в Yandex Cloud
  7. Веб-сервер на ВМ: метаданные, user-data и группы безопасности
  8. Переменные ввода и выходные значения в Terraform
  9. Кластер ВМ: группа экземпляров Yandex Compute Instance Group
  10. Балансировщик нагрузки: Application Load Balancer в Yandex Cloud
  11. Состояние Terraform: что такое tfstate и чем опасен локальный файл
  12. Удалённое хранилище состояния: бэкенд на Yandex Object Storage
  13. Изоляция состояния: рабочие области против раскладки по папкам
  14. Источники данных и terraform_remote_state: связываем компоненты
  15. Модули Terraform: переиспользуем инфраструктуру
  16. Входные, локальные и выходные переменные модуля
  17. Версионирование модулей и подводные камни
  18. Циклы в Terraform: параметр count
  19. Циклы в Terraform: for_each по множествам и картам
  20. Выражения for и строковые директивы
  21. Условная логика: count-трюк, for_each и директива if
  22. Встроенные функции, типы и выражения HCL
  23. Развёртывание без простоя: create_before_destroy
  24. Подводные камни Terraform и рефакторинг с блоком moved
  25. Управление секретами: основы и типы
  26. Инструменты управления секретами: Yandex Lockbox, Vault, SOPS
  27. Аутентификация провайдера и секреты: сервисные аккаунты и OIDC
  28. Секреты в ресурсах и состоянии, ephemeral-значения
  29. Провайдеры Terraform: установка, версии, required_providers
  30. Несколько копий одного провайдера: alias и мультизона
  31. Несколько провайдеров и аккаунтов: configuration_aliases
  32. Terraform, Docker и Kubernetes: Managed Kubernetes в Yandex Cloud
  33. Код Terraform промышленного уровня: почему это долго (вы здесь)
  34. Мелкие компонуемые модули вместо монолита
  35. Тестируемые модули и проверки: validation, precondition, postcondition
  36. Версионирование, публикация модулей и Terragrunt
  37. Ручное тестирование Terraform и очистка ресурсов
  38. Автоматические тесты на Terratest: модульные тесты
  39. Интеграционные и сквозные тесты, пирамида тестирования
  40. Нативный terraform test и статический анализ
  41. Внедрение Terraform в команде: процессы и культура
  42. Конвейер развёртывания прикладного кода
  43. Конвейер инфраструктурного кода и золотое правило Terraform
  44. Стиль, ревью и CI/CD-инструменты: Atlantis, TACOS, policy as code
  45. Что нового в Terraform 1.3-1.10: моды, импорт, провайдер-функции, Stacks
  46. OpenTofu в 2026: чем живёт форк и как мигрировать
  47. Сертификация HashiCorp Terraform Associate и карьера
Урок 32. Ты написал terraform apply, поднял виртуалку за три минуты и подумал, что прод тоже будет готов к вечеру. Спойлер: нет.

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

Боль: оценка "на глаз" всегда врёт

Классика. Менеджер спрашивает: "сколько займёт поднять окружение в Yandex Cloud?". Ты прикидываешь: ну, сеть, пара ВМ, база, балансировщик... дня три? Через три недели ты всё ещё дебажишь, почему бэкапы не восстанавливаются, а알ерты молчат, когда сервис лежит.

Дело в том, что terraform plan apply на голую виртуалку и реальная прод-инфраструктура как код - это две разные вселенные. Первое - hello world. Второе - система, которой можно доверить деньги, данные и сон дежурного инженера. Терраформ тут ни в чём не виноват, инструмент быстрый. Долго не писать HCL, долго - довести инфраструктуру до состояния, в котором её не стыдно отдать в эксплуатацию.

Изображение

Yak shaving: почему ты бреешь яка

Есть отличный термин - yak shaving (бритьё яка). Это когда ты сел сделать простую задачу, но чтобы её сделать, надо сначала сделать другую, а для неё - третью, и вот ты уже бреешь яка, хотя начинал с "подними мне базу".

Реальный пример из terraform yandex cloud. Задача: поднять managed PostgreSQL.
  • Чтобы поднять базу, нужна сеть и подсеть.
  • Чтобы сеть была безопасной, нужны security groups с правилами.
  • Чтобы хранить terraform state не локально, а в Object Storage, нужен бакет.
  • Чтобы создать бакет, нужен сервисный аккаунт с правами и статический ключ доступа.
  • Чтобы выдать права, надо разобраться с ролями IAM в облаке.
И вот ты три часа ковыряешь IAM, хотя хотел просто базу. Это не баг процесса, это нормальная работа над инфраструктурой как код. Каждый ресурс тянет за собой хвост зависимостей, и хвост этот в туториалах обрезан.

Скрытая сложность и неполный список требований

Главная ловушка прод-инфры - неполный список требований. Заказчик (или ты сам) формулирует: "нужен сервис, доступный из интернета". И всё. А за этой фразой прячется:
  • Безопасность. Security groups, приватные подсети, шифрование дисков, секреты не в открытом виде, принцип наименьших привилегий в IAM.
  • Мониторинг. Метрики, логи, дашборды, алерты. Если сервис упал и никто не узнал - значит, мониторинга нет.
  • Бэкапы. И не просто "включили бэкапы", а проверенное восстановление. Бэкап, который ни разу не разворачивали, - это шум, а не бэкап.
  • Отказоустойчивость (HA). Несколько зон доступности, балансировщик, реплики базы. Одна ВМ в одной зоне - это не прод, это демка с амбициями.
  • Масштабирование. Группы инстансов с автоскейлингом, чтобы чёрная пятница не положила сервис.
  • Документация. README, описание модулей, схема сети. Через полгода ты сам не вспомнишь, зачем тут эта подсеть.
  • CI/CD. terraform plan в pull request, apply через пайплайн с ревью, а не с ноутбука "ну я быстренько".
Семь пунктов. И на старте о них обычно вспоминают только про первый, да и то наполовину. Вот откуда берётся разница между "за вечер" и "за три недели".

Практика: видно разницу глазами

Вот так выглядит "демо-прод", который собирают за полчаса и показывают на конференциях:

Код: Выделить всё

resource "yandex_compute_instance" "app" {
  name        = "app"
  platform_id = "standard-v3"
  zone        = "ru-central1-a"

  resources {
    cores  = 2
    memory = 4
  }

  boot_disk {
    initialize_params {
      image_id = "fd8..."   # образ Ubuntu
    }
  }

  network_interface {
    subnet_id = yandex_vpc_subnet.subnet_a.id
    nat       = true        # публичный IP прямо на ВМ
  }
}
Одна ВМ, публичный IP, никакого балансировщика, бэкапов и групп безопасности. Работает? Да. Прод? Нет.

А теперь кусок того, что нужно реально, - группа инстансов с автоскейлингом и распределением по зонам. Тут сразу и HA, и масштабирование:

Код: Выделить всё

resource "yandex_compute_instance_group" "app_ig" {
  name               = "app-ig"
  service_account_id = yandex_iam_service_account.ig_sa.id

  instance_template {
    platform_id = "standard-v3"
    resources {
      cores  = 2
      memory = 4
    }
    boot_disk {
      initialize_params {
        image_id = "fd8..."
        size     = 20
      }
    }
    network_interface {
      network_id = yandex_vpc_network.net.id
      subnet_ids = [yandex_vpc_subnet.subnet_a.id, yandex_vpc_subnet.subnet_b.id]
    }
  }

  scale_policy {
    auto_scale {
      initial_size           = 2
      max_size               = 6
      measurement_duration   = 60
      cpu_utilization_target = 70
    }
  }

  allocation_policy {
    zones = ["ru-central1-a", "ru-central1-b"]
  }

  deploy_policy {
    max_unavailable = 1
    max_expansion   = 2
  }
}
Чувствуешь разницу в объёме? И это всё ещё только compute. Сюда же добавь managed-базу с включёнными бэкапами и репликой в другой зоне:

Код: Выделить всё

resource "yandex_mdb_postgresql_cluster" "db" {
  name        = "prod-db"
  environment = "PRODUCTION"
  network_id  = yandex_vpc_network.net.id

  config {
    version = "16"
    resources {
      resource_preset_id = "s3-c2-m8"
      disk_type_id       = "network-ssd"
      disk_size          = 50
    }
    backup_window_start {
      hours   = 3
      minutes = 0
    }
  }

  host {
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }
  host {
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }
}
Две хост-реплики в разных зонах, environment PRODUCTION, окно бэкапа. И это только база. А ведь ещё нужны security groups, балансировщик, сервисные аккаунты, мониторинг, удалённый terraform state в бакете... Видишь, как простая задача обрастает кодом?

Типичные грабли
  • Считать только время на написание HCL. Написать ресурс - 20 минут. Проверить, что он переживёт apply на чистом окружении, починить циклические зависимости, дождаться, пока кластер реально поднимется (managed-базы создаются по 10-15 минут), - вот где время.
  • Игнорировать "обвязку". state, бэкенд, модули terraform, переменные, секреты. Это не код инфраструктуры напрямую, но без него прод не живёт.
  • "Потом добавим мониторинг". Не добавите. Прикручивать наблюдаемость к работающему проду в десять раз больнее, чем заложить сразу.
  • Один большой main.tf. Без разбивки на модули terraform через полгода это болото, которое страшно трогать.
  • Путать opentofu и terraform в команде. Если часть людей на opentofu, а часть на terraform, договоритесь на берегу про версию и провайдеров, иначе state будет ловить сюрпризы.
Мини-лаба

Кодить ничего не надо, упражнение на голову. Но сделай руками, на бумаге или в заметках:
  • Возьми любую свою "простую" задачу, например "поднять веб-сервис в Yandex Cloud".
  • Выпиши все семь требований прод-инфры из урока и честно ответь по каждому: есть оно у тебя или нет.
  • Для каждого недостающего прикинь, какие ресурсы terraform yandex cloud придётся добавить (балансировщик, группа инстансов, бэкап, security group и так далее).
  • Сложи грубые оценки времени. Сравни с первой интуитивной цифрой "за вечер". Поразись.
Контрольные вопросы
  • Что такое yak shaving и почему это нормальная часть работы над инфраструктурой как код?
  • Перечисли по памяти семь категорий требований к прод-инфраструктуре.
  • Почему "бэкап есть" и "бэкап работает" - это разные вещи?
  • Чем демо-конфиг с одной ВМ принципиально отличается от прод-конфига с группой инстансов и managed-базой?
Итог: что запомнить

Терраформ быстрый - долго не он, а доведение инфраструктуры до прод-готовности. "Готовая к проду" значит: безопасность, мониторинг, бэкапы (проверенные), HA, масштабирование, документация и CI/CD закрыты, а не отложены "на потом". Большая часть времени уходит на скрытую сложность и yak shaving, а не на печатание HCL. Когда в следующий раз будешь давать оценку - умножай интуицию на список из семи пунктов, а не на оптимизм. И закладывай обвязку (terraform state, модули, бэкенд) с самого начала, а не после первого инцидента.
👍2 ❤️1 🔥1 😄 🤔1
Аватара пользователя
Morenito
Сообщения: 1
Зарегистрирован: 05 июн 2026, 17:19

Re: Код Terraform промышленного уровня: почему это долго

Сообщение Morenito »

Спасибо, дошло наконец, почему мой пет-проект на одной ВМ нельзя называть продом. Особенно про бэкап, который никто не восстанавливал, прям про меня, лежит и думаю что я молодец.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
seisei
Сообщения: 1
Зарегистрирован: 29 май 2026, 21:45

Re: Код Terraform промышленного уровня: почему это долго

Сообщение seisei »

А есть гайд по тому самому удаленному state в Object Storage и сервисному аккаунту? Это как раз тот як, на котором я застрял на втором абзаце, до базы так и не добрался.
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Terraform, Docker и Kubernetes: Managed Kubernetes в Yandex Cloud
Следующая глава →
Мелкие компонуемые модули вместо монолита

Все главы курса «Terraform: инфраструктура как код на Yandex Cloud»

Поделиться темой: ✈ Telegram VK
Похожие запросы: terraform yandex cloud с чего начать новичкукак установить terraform и opentofu на linuxчто такое terraform state и tfstate простыми словамиудаленный backend terraform на object storage yandex cloudчто такое инфраструктура как код iac простыми словамиterraform plan и apply что делают и чем отличаются

Вернуться в «Terraform: инфраструктура как код на Yandex Cloud»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость