Содержание

Инфраструктура как код (Infrastructure as Code, IaC) — это подход, при котором серверы, сети, базы данных, DNS и доступы описываются в текстовых файлах и создаются инструментом автоматически, а не настраиваются вручную в панели провайдера. Так инфраструктура становится воспроизводимой, проверяемой на ревью и восстанавливаемой после аварии. Самый распространённый инструмент — Terraform и его открытый форк OpenTofu.

Разберём, какие проблемы решает IaC, как работает Terraform, как хранить состояние и секреты и с чего начать.

Какие проблемы решает инфраструктура как код?

Ручная настройка через веб-панели плохо масштабируется: никто точно не помнит, какие настройки и почему были сделаны, окружения расходятся, а пересоздать всё после аварии или для нового клиента оказывается неделей работы.

Что даёт IaC:

  • воспроизводимость — тестовое окружение создаётся точной копией продакшена;
  • история изменений — каждое изменение видно в репозитории: кто, когда и зачем;
  • ревью — изменения инфраструктуры проходят проверку, как обычный код;
  • восстановление — после аварии инфраструктура поднимается командой, а не по памяти;
  • документация — код и есть актуальное описание того, что развёрнуто.

Как работает Terraform?

В Terraform вы описываете желаемое состояние: какие ресурсы должны существовать и с какими параметрами. Инструмент сравнивает описание с реальностью, показывает план изменений и после подтверждения создаёт, изменяет или удаляет ресурсы через API провайдера.

resource "yandex_compute_instance" "app" {
  name        = "app-1"
  platform_id = "standard-v3"

  resources {
    cores  = 2
    memory = 4
  }

  boot_disk {
    initialize_params {
      image_id = var.ubuntu_image_id
      size     = 30
    }
  }

  network_interface {
    subnet_id = yandex_vpc_subnet.main.id
    nat       = true
  }
}

Основной цикл работы:

  1. Изменить описание в коде.
  2. Выполнить plan и посмотреть, что именно изменится.
  3. Пройти ревью вместе с планом.
  4. Выполнить apply — лучше из CI, а не с ноутбука.

Подробнее о пайплайнах — статья CI/CD на GitHub Actions.

Строительные краны над городом в сумерках Фото: Unsplash

Как хранить состояние и секреты?

Terraform хранит файл состояния — соответствие между кодом и реальными ресурсами. Его нельзя держать на ноутбуке или в репозитории: состояние хранят в удалённом хранилище с блокировкой, чтобы два человека не применили изменения одновременно, и с шифрованием, потому что в нём могут оказаться секреты.

Что Где хранить Почему
Код инфраструктуры Git-репозиторий История и ревью
Состояние Объектное хранилище с блокировкой Общий доступ, защита от параллельных изменений
Секреты Менеджер секретов или переменные CI Не попадают в код и историю
Переменные окружений Отдельные файлы или рабочие пространства Разделение тестового и боевого окружения

О работе с секретами подробнее — в статье секреты в проекте.

Как организовать код инфраструктуры?

Код инфраструктуры организуют так же, как обычный: повторяющиеся части выносят в модули, окружения разделяют, а изменения проходят ревью. Важно разделять состояния — чтобы ошибка в тестовом окружении не могла задеть продакшен.

  • модули для повторяющихся блоков: сеть, кластер базы данных, сервер приложения;
  • отдельные каталоги или рабочие пространства для тестового окружения и продакшена;
  • фиксированные версии провайдеров и модулей;
  • автоматический plan в каждом пулл-реквесте;
  • запрет ручных изменений в панели провайдера для ресурсов, описанных в коде.

С чего начать небольшой команде?

Небольшой команде не нужно описывать всё сразу. Начните с ресурсов, которые сложнее всего восстановить вручную и которые чаще меняются: DNS, сети, база данных, объектное хранилище и серверы приложения. Остальное можно переносить постепенно.

  1. Опишите в коде новое тестовое окружение — так безопаснее учиться.
  2. Импортируйте существующие ресурсы продакшена по одному.
  3. Настройте удалённое состояние с блокировкой.
  4. Добавьте plan в CI и применяйте изменения только через пайплайн.
  5. Для настройки самих серверов используйте Docker или Ansible — подробнее в статье Docker для разработки и продакшена.

Про выбор между облаком и своими серверами — статья VPS, облако или managed-сервисы.

Коротко

  • IaC описывает инфраструктуру в коде, а не в ручных настройках панели.
  • Это даёт воспроизводимость, историю, ревью и быстрое восстановление.
  • Terraform сравнивает описание с реальностью и применяет изменения по плану.
  • Состояние хранят удалённо, с блокировкой и шифрованием, секреты — отдельно.
  • Начинайте с тестового окружения и самых критичных ресурсов.

Частые вопросы

  • Нужна ли инфраструктура как код для одного сервера?

    Для одного VPS полноценный Terraform может быть избыточен, но описать настройку сервера в скрипте или Ansible всё равно полезно: так сервер можно быстро пересоздать после аварии.

  • Чем Terraform отличается от Ansible?

    Terraform создаёт и удаляет ресурсы — серверы, сети, базы, DNS-записи. Ansible настраивает уже существующие машины — ставит пакеты и меняет конфигурацию. Их часто используют вместе.

  • Что делать, если кто-то поменял инфраструктуру вручную?

    Команда plan покажет расхождение между кодом и реальностью. Дальше либо переносят изменение в код, либо применяют код и откатывают ручную правку. Главное — договориться, что изменения идут только через код.