← Infrastructure as Code
13 мин · средне · Урок 2 из 5

Terraform: первый ресурс

Провайдеры, ресурсы, plan и apply, state-файл. Как Terraform приводит облако к описанию.

Что делает Terraform

Terraform берёт текстовое описание инфраструктуры и создаёт её в облаке. Ты пишешь, что должно быть, Terraform сравнивает это с тем, что уже есть, и делает только разницу. Тот же декларативный подход, что в прошлом уроке, теперь на практике.

Описание пишут на языке HCL в файлах .tf.

Рядом с Terraform живёт открытый форк OpenTofu с тем же языком и командами. Появился он из-за смены лицензии. В августе 2023 HashiCorp перевела Terraform с открытой MPL на Business Source License (BSL), лицензию с ограничениями на коммерческое использование. Часть сообщества и компаний, строивших продукты вокруг Terraform, ответила манифестом OpenTF 25 августа 2023. В сентябре того же года проект переименовали в OpenTofu и передали в Linux Foundation, а в январе 2024 вышел первый стабильный релиз 1.6.0.

Практически они пока очень близки: .tf-файлы, init/plan/apply, провайдеры. Всё, что дальше в уроке, работает в обоих один в один, только бинарь называется tofu.

Провайдер и ресурс

Две главные сущности — провайдер и ресурс.

Провайдер — плагин для конкретного облака (Yandex Cloud, AWS, Hetzner). Он знает, как обращаться к API этого облака.

Ресурс — конкретный объект: виртуалка, сеть, бакет.

terraform {
  required_providers {
    yandex = { source = "yandex-cloud/yandex" }
  }
}

provider "yandex" {
  zone = "ru-central1-a"
}

resource "yandex_compute_instance" "web" {
  name   = "web-01"
  resources {
    cores  = 2
    memory = 4
  }
}

Блок resource "тип" "имя" описывает один объект. тип (yandex_compute_instance) задаёт провайдер, имя (web) — локальная ссылка внутри кода, чтобы другие ресурсы могли на него ссылаться.

Рабочий цикл: init, plan, apply

terraform init     # скачать провайдеры, подготовить рабочую папку
terraform plan     # показать, что Terraform собирается сделать
terraform apply    # применить изменения

terraform plan — главная команда для безопасности. Она ничего не меняет, только показывает разницу между кодом и реальностью:

$ terraform plan
Terraform will perform the following actions:
  + resource "yandex_compute_instance" "web" {
      + name = "web-01"
      + cores = 2
    }
Plan: 1 to add, 0 to change, 0 to destroy.

+ — создать, ~ — изменить, - — удалить. Всегда читаешь plan перед apply: так дрейф и случайные удаления видно заранее. terraform destroy сносит всё, что описано. Подходит для временных окружений.

State: память Terraform

Чтобы знать, что он уже создал, Terraform хранит state — файл terraform.tfstate с текущим состоянием инфраструктуры. По нему он понимает, что менять, а что трогать не надо.

State критичен и опасен одновременно:

Потеря state — это потеря связи между кодом и реальными ресурсами, поэтому его берегут и бэкапят.

Что важно запомнить

Terraform создаёт инфраструктуру из HCL-описания: провайдер знает API облака, ресурс описывает один объект.

Цикл: init → plan → apply. plan показывает разницу и ничего не меняет. Его читают всегда перед apply.

State (terraform.tfstate) хранит, что уже создано; в нём секреты, поэтому его не коммитят в git, а выносят в общее хранилище с блокировкой.

В следующих уроках разберём GitOps, где такой код применяется автоматически из git.

Прошли материал до конца? Отметьте урок пройденным.