В разделе описаны основные принципы, по которым провайдер Cloud.ru взаимодействует с облачной платформой Evolution. Понимание этих концепций позволяет писать более эффективные конфигурации, предугадывать поведение Terraform и самостоятельно устранять часть неполадок.
В работе Terraform можно выделить две основные части:
Terraform — читает ваши .tf-файлы, отвечает за описание и управление инфраструктурным графом и состоянием, определяет последовательность операций — создать, обновить, удалить — и ничего не знает о платформе Evolution.
Провайдер Cloud.ru — плагин, который выступает в роли «переводчика». Провайдер преобразует команды из манифеста в конкретные HTTP-вызовы к API продуктов Cloud.ru. Например, POST /v1/instances. Все взаимодействие с облаком происходит через его публичное API.
Провайдер не использует личный кабинет, CLI или SDK — он строго зависит от доступности API.
terraform plan — что будет сделано?
Провайдер получает список ресурсов и их желаемое состояние.
Для каждого ресурса в конфигурации провайдер запрашивает у API его текущее состояние (если ресурс уже существует). Для этого используется уникальный идентификатор, хранящийся в файле состояния .tfstate.
Провайдер сравнивает желаемое состояние (код) с актуальным состоянием (из API).
Результат сравнения по каждому ресурсу (create, update, delete, no-op) возвращается для формирования плана.
terraform apply — применяет манифест.
Terraform определяет порядок операций на основе зависимостей (ресурс сети создается до ВМ).
Terraform вызывает соответствующую функцию провайдера, например CreateInstance, UpdateLoadBalancer, для каждой операции.
Провайдер выполняет операции строго последовательно в рамках одного ресурса. Он не может одновременно изменить размер диска и переименовать его.
Это одна операция UPDATE к API, которая может включать несколько полей, но выполняется как единый вызов.
Файл состояния .tfstate.
Для Terraform этот источник — единственный, по которому он определяет, какие ресурсы им управляются.
После успешного применения провайдер записывает в состояние идентификаторы, возвращенные API (например, vm-12345). Без этих ID провайдер не сможет найти ресурс в облаке при следующем запуске.
Не редактируйте этот файл вручную. Расшаривайте его через удаленный бэкенд, например, S3.
Понимание этих моментов спасет от многих часов отладки:
Атомарность операций
С точки зрения Cloud.ru, изменение ресурса (update) — это чаще всего замена или пересоздание (recreate), а не «патч». Например, изменение типа машины обычно требует остановки, удаления и создания новой. Провайдер пытается это смягчить, но логика зашита в API облака.
Зависимости и параллелизм
Terraform создает независимые ресурсы параллельно для скорости. Если ВМ A зависит от сети B (через depends_on или ссылку), провайдер создаст B первым, дождется успеха, а затем начнет создание A.
Обработка ошибок и идемпотентность
Если операция создания завершилась ошибкой 409 Conflict (ресурс уже существует), провайдер не удалит его автоматически. Он попытается считать его атрибуты и «подхватить» в управление (import).
Провайдер стремится к идемпотентности: повторный вызов apply с той же конфигурацией не должен ничего менять в облаке (вы получите план «No changes»).
Rate Limiting и квоты API
Провайдер делает прямые вызовы к API. Если вы упретесь в лимиты запросов в секунду или в квоты своей учетной записи (например, «не более 5 IP-адресов»), API вернет ошибку, и apply встанет. Провайдер может использовать retry с экспоненциальной задержкой, но это не поможет при исчерпании квот.
Чтение-после-записи (Read-after-write)
Иногда ресурс в API появляется не мгновенно. После вызова Create, провайдер делает периодические запросы Read, чтобы дождаться перехода ресурса в статус ACTIVE и считать все его вычисляемые атрибуты (IP-адрес, DNS-имя).
Роли и ограничения
Администратор, использующий Terraform для управления облачной инфраструктурой, действует в рамках ролевой модели и политики доступа. Перед настройкой Terraform необходимо ознакомиться с документацией по ролям и определить минимальный набор разрешений, необходимый для создания, изменения и удаления ресурсов.
Включите детальное логирование export TF_LOG=DEBUG. Вы увидите все HTTP-запросы и ответы между провайдером и API. Это главный инструмент для понимания того, «что пошло не так».
ВниманиеВ случае возникновения ошибок при работе с ресурсами, если вы не до конца понимаете, в чем проблема, рекомендуем включить режим детального логирования!
Если кто-то вручную изменил ресурс в облаке через личный кабинет или через API напрямую, следующее выполнение terraform plan обнаружит расхождение между фактическим состоянием и стейтом и предложит сделать refresh. Старайтесь избегать этого дрейфа состояний – используйте одну точку входа для управления облачной инфраструктурой.
ПримечаниеДрейф состояния - это ситуация, при которой реальное состояние инфраструктуры отличается от того, что Terraform записал в своем .tfstate-файле.
Используйте terraform validate — при использовании данной команды, Terraform проверит ваши tf-файлы на корректность HCL-синтаксиса и согласованность конфигурации независимо от текущего состояния инфраструктуры и переменных. Применение ее перед terraform plan и terraform apply поможет избежать проблем на начальном этапе.
Проверяйте справочник API Cloud.ru Evolution — возможно существуют ограничения платформы.
Изучите примеры конфигураций — актуальные примеры ресурсов и источников данных доступны в разделе Справочник.
Главный принцип можно сформулировать следующим образом: Terraform принимает решения, какие изменения необходимы, а провайдер отвечает за то, как эти изменения выполнить в Evolution.