Первый ресурс: разворачиваем виртуальную машину в Yandex Cloud

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

Первый ресурс: разворачиваем виртуальную машину в Yandex Cloud

Сообщение 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 и карьера
До этого урока ты читал про terraform, инфраструктуру как код и теорию IaC. Сейчас будет первый момент, ради которого всё затевалось: ты напишешь несколько строк конфига и через минуту в облаке появится живая виртуальная машина. Не нарисованная в веб-консоли мышкой за десять кликов, а описанная кодом, который можно положить в git, показать коллеге и повторить хоть сто раз.

Боль, которую мы лечим, простая. Создавать ВМ руками - это всегда "а какую зону я выбрал в прошлый раз", "а сколько ядер было", "а почему у соседней машины другой образ Ubuntu". Через terraform yandex cloud вся эта память переезжает в текстовый файл. Файл - источник правды. Это и есть наш Hello World, только вместо вывода строки в консоль мы поднимаем настоящий сервер.

Что нам нужно описать

Чтобы ВМ в Yandex Cloud вообще запустилась, ей нужна сеть. Машина без сетевого интерфейса никуда не подключится, поэтому минимальный набор - это три ресурса:
  • yandex_vpc_network - сама виртуальная сеть, контейнер верхнего уровня.
  • yandex_vpc_subnet - подсеть внутри неё, привязанная к зоне доступности, с диапазоном адресов.
  • yandex_compute_instance - собственно виртуальная машина, которая воткнётся интерфейсом в эту подсеть.
Плюс служебная обвязка: блок terraform с required_providers (говорим, какой провайдер качать) и блок provider yandex (говорим, в какое облако и папку ходить). Начнём с неё.

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

terraform {
  required_providers {
    yandex = {
      source  = "yandex-cloud/yandex"
    }
  }
  required_version = ">= 1.5"
}

provider "yandex" {
  zone = "ru-central1-a"
  # cloud_id, folder_id и токен удобнее задавать
  # через переменные окружения или yc init,
  # чтобы не светить их в коде
}
Тут важный нюанс про source. Раньше провайдеры брались из корня реестра, но сейчас правильно указывать полный путь yandex-cloud/yandex. Это работает и для terraform, и для opentofu - открытого форка, на который многие переехали после смены лицензии HashiCorp. Синтаксис у них общий, так что всё ниже одинаково применимо.

Изображение

Описываем сеть и машину

Теперь сами ресурсы. Обрати внимание, как они ссылаются друг на друга через выражения вида yandex_vpc_network.main.id - terraform сам поймёт порядок создания по этим связям, об этом был отдельный разговор про граф зависимостей.

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

resource "yandex_vpc_network" "main" {
  name = "lesson5-net"
}

resource "yandex_vpc_subnet" "main" {
  name           = "lesson5-subnet"
  zone           = "ru-central1-a"
  network_id     = yandex_vpc_network.main.id
  v4_cidr_blocks = ["10.5.0.0/24"]
}

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

  resources {
    cores  = 2
    memory = 2
  }

  boot_disk {
    initialize_params {
      # ID публичного образа Ubuntu 22.04 LTS;
      # актуальный смотри в каталоге образов YC
      image_id = "fd8ccfn8achs7l1q73vh"
      size     = 10
    }
  }

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

  metadata = {
    ssh-keys = "ubuntu:${file("~/.ssh/id_ed25519.pub")}"
  }
}
Разберём по косточкам, чтобы ты не воспринимал это как магию.
  • platform_id - поколение железа. standard-v3 это актуальные процессоры Intel Ice Lake, дефолт для большинства задач.
  • resources - блок с cores и memory. Оба обязательные. memory задаётся в гигабайтах, поэтому 2 это 2 ГБ, а не 2 МБ.
  • boot_disk с вложенным initialize_params - тут мы говорим "создай новый диск из образа". Альтернатива - disk_id, если диск уже существует. Атрибут image_id берёт публичный образ Ubuntu, size - размер диска в ГБ.
  • network_interface - сетевая карта. subnet_id обязателен, подсеть должна жить в той же зоне, что и машина. nat = true выдаёт внешний IP, иначе достучаться по SSH снаружи не выйдет.
  • metadata с ssh-keys - закидываем публичный ключ внутрь машины, чтобы потом зайти под пользователем ubuntu. Функция file читает файл с диска.
Все имена атрибутов выше - не выдуманные, они ровно из документации провайдера yandex. Если опечатаешься в названии, terraform plan честно ругнётся ещё до похода в облако.

Полный цикл: init, plan, apply, destroy

Сохрани всё в файл main.tf и поехали по шагам. Это четыре команды, которые ты будешь повторять до конца жизни как DevOps.

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

terraform init
Скачивает провайдер yandex и складывает его в папку .terraform, создаёт lock-файл с версиями. Делается один раз на проект (и повторно, если меняешь провайдеры). Для opentofu команда называется tofu init - дальше всё по аналогии.

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

terraform plan
Самая важная команда урока. Terraform читает твой код, сверяет его с terraform state (пока пустым) и показывает разницу. Ты увидишь список из трёх ресурсов со знаком плюс:
Plan: 3 to add, 0 to change, 0 to destroy.
Читать plan надо обязательно, а не проматывать. Зелёный плюс перед именем ресурса - будет создан. Тильда - будет изменён на месте. Минус - будет удалён. А самое страшное сочетание это минус-плюс (-/+), оно означает "пересоздать", то есть старый ресурс снесут и поднимут новый. Для базы данных или диска с продакшен-данными такое читается как сигнал тревоги. Строки со значением (known after apply) - это атрибуты, которые облако присвоит само: IP-адреса, ID, fqdn. Их terraform узнает только после создания, и это нормально.

Когда plan устраивает - применяем.

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

terraform apply
Terraform снова покажет план и спросит подтверждение - надо набрать yes. После этого он идёт в API Yandex Cloud, создаёт сеть, потом подсеть, потом машину (порядок выбирает сам по зависимостям) и записывает результат в файл terraform.tfstate. Через минуту-полторы машина будет в статусе RUNNING.

Теперь проверь руками: зайди в веб-консоль Yandex Cloud, раздел Compute Cloud. Машина lesson5-vm должна быть там, с тем самым внешним IP, который apply вывел в конце. Можешь даже подключиться: ssh ubuntu@внешний_ip. Вот он, мост между кодом и реальностью.

Наигрался - убираем за собой, чтобы не капали деньги:

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

terraform destroy
Команда покажет "3 to destroy", спросит yes и снесёт всё, что создавала, в обратном порядке. State опустеет. Это, кстати, суперспособность IaC: поднять и снести целую среду одной командой - то, что руками заняло бы полчаса кликанья.

Типичные грабли
  • Зоны не совпадают. Машина в ru-central1-a, а подсеть случайно в ru-central1-b - apply упадёт. subnet_id обязан быть в той же зоне, что и инстанс.
  • Забыл nat = true. ВМ создастся, но без внешнего IP. По SSH снаружи не зайдёшь и будешь думать, что сломал сеть.
  • Устаревший image_id. ID образов в каталоге меняются. Если provider ругается на несуществующий образ - возьми свежий image_id Ubuntu из официального каталога образов YC.
  • Не задан folder_id. Провайдер не знает, в какую папку складывать ресурсы. Проще всего прогнать yc init и экспортнуть переменные окружения, тогда токен и folder_id подхватятся сами.
  • Применил без чтения plan. Классика. Привыкай смотреть на план как на чек перед оплатой - один раз сэкономит тебе боевую базу.
Мини-лаба

Повтори руками, не копируя бездумно:
  • Собери main.tf из трёх ресурсов выше и блока provider.
  • Прогони terraform init и найди в выводе, какую версию провайдера он скачал.
  • Сделай terraform plan и вслух проговори, что именно создастся и почему "3 to add".
  • Запусти apply, дождись RUNNING, найди машину в веб-консоли.
  • Поменяй cores с 2 на 4, снова сделай plan - и посмотри, покажет он change или пересоздание.
  • Обязательно заверши destroy, чтобы ничего не висело.
Контрольные вопросы
  • Зачем для одной ВМ нужны ещё два ресурса - network и subnet?
  • Чем отличается boot_disk с initialize_params от boot_disk с disk_id?
  • Что означают в выводе plan символы +, ~ и -/+, и какой из них опаснее всего?
  • Что физически произойдёт, если в network_interface убрать nat = true?
Что запомнить

Минимальная ВМ в Yandex Cloud - это сеть плюс подсеть плюс compute_instance, связанные через .id. Рабочий цикл всегда один: init подтягивает провайдер, plan показывает diff (читаем его как договор), apply создаёт и пишет в terraform state, destroy всё убирает. Имена атрибутов бери из доки провайдера, а не из головы - resources с cores/memory, boot_disk с image_id, network_interface с subnet_id и nat. И главное правило на всю карьеру: сначала plan, потом думаешь, и только потом apply.
👍4 ❤️1 🔥2 😄 🤔2
Аватара пользователя
jettaboy
Сообщения: 1
Зарегистрирован: 18 май 2026, 21:40

Re: Первый ресурс: разворачиваем виртуальную машину в Yandex Cloud

Сообщение jettaboy »

Спасибо, наконец-то дошло зачем эти network и subnet для одной машинки. Я раньше в консоли тыкал и не понимал почему оно само создается, а тут все по полочкам.
👍1 ❤️1 🔥 😄 🤔
Аватара пользователя
kafka_admin
Сообщения: 1
Зарегистрирован: 15 май 2026, 01:45

Re: Первый ресурс: разворачиваем виртуальную машину в Yandex Cloud

Сообщение kafka_admin »

А вопрос: я забыл nat = true и реально полчаса гадал почему ssh не идет, машина есть а зайти не могу. Может стоит в граблях прям жирным выделить, очень частая засада походу.
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Установка Terraform и OpenTofu, подготовка Yandex Cloud
Следующая глава →
Веб-сервер на ВМ: метаданные, user-data и группы безопасности

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

Поделиться темой: ✈ Telegram VK
Похожие запросы: управление секретами в terraform yandex lockbox

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

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

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