Как использовать Terraform для создания инфраструктуры как кода (IaC)

11 минут чтения
Средний рейтинг статьи — 4.9

Инфраструктура как код (Infrastructure as Code, IaC) — это подход, при котором серверы, сети, базы данных, облачные ресурсы и другие компоненты описываются в виде конфигурационных файлов, а не настраиваются вручную. Один из самых популярных инструментов для IaC — Terraform. Он позволяет описывать инфраструктуру в декларативной форме и развертывать её одинаково в AWS, Google Cloud, Yandex Cloud, Hetzner, DigitalOcean и десятках других платформ.

В этой статье разберём, как Terraform работает, из чего он состоит, как написать свой первый конфиг и выполнить развертывание.

Что такое Terraform и как он работает

Terraform — это инструмент HashiCorp, который преобразует конфигурационные файлы (с расширением .tf) в реальные инфраструктурные объекты.

Основа работы Terraform:

  1. Конфигурация — вы описываете, что должно быть создано.
  2. Планирование (terraform plan) — Terraform анализирует текущее состояние инфраструктуры и формирует список изменений.
  3. Применение (terraform apply) — Terraform создаёт или изменяет ресурсы.
  4. Хранение состояния (terraform.tfstate) — состояние всей инфраструктуры записывается в файл или удалённое хранилище.

Terraform полностью декларативен: вы описываете желаемый результат, а он сам решает, как его достичь.

Структура файлов Terraform

Обычно конфигурация состоит из:

  • provider — указание облака или платформы;
  • resource — то, что Terraform должен создать;
  • variable — входные переменные;
  • output — что выводить после развертывания.

Пример минимальной структуры:

main.tf
variables.tf
outputs.tf
terraform.tfvars
provider.tf

Но для небольших проектов можно всё держать в одном файле.

Установка Terraform

Linux

curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo tee /usr/share/keyrings/hashicorp.gpg > /dev/null
sudo apt-add-repository "deb [signed-by=/usr/share/keyrings/hashicorp.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt update && sudo apt install terraform

macOS (Homebrew)

brew tap hashicorp/tap
brew install hashicorp/tap/terraform

Windows (Chocolatey)

choco install terraform

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

Рассмотрим минимальный пример, на котором сразу видно, как работает Terraform.

В начале файла main.tf необходимо описать используемый провайдер:

terraform {
  required_providers {
    twc = {
      source = "tf.timeweb.cloud/timeweb-cloud/timeweb-cloud"
    }
  }
  required_version = ">= 0.13"
}

Провайдер совместим только с Terraform версии 0.13 и выше, поэтому более старые версии работать не будут.

Настройка API-токена

Провайдер Timeweb Cloud работает через API, поэтому потребуется API-токен из панели управления Timeweb Cloud.
Его можно использовать двумя способами:

  1. Через переменную окружения
export TWC_TOKEN=eyJhbGc...
  1. Внутри конфигурации Terraform
provider "twc" {
  token = "eyJhbGci..."
}

Важно: у токена должно быть отключено подтверждение удаления серверов через Telegram, иначе Terraform не сможет корректно управлять ресурсами.

Создание конфигурации ресурсов

Terraform позволяет управлять большим количеством ресурсов Timeweb Cloud — виртуальными серверами, сетями, SSH-ключами, образами ОС и многим другим.

Ниже — пример минимальной конфигурации, которая создаёт виртуальный сервер с указанием:

  • локации ru-1
  • NVMe-диска 10–15 Гб
  • CPU: 1 ядро
  • RAM: 1 ГБ
  • ОС Ubuntu 22.04

Вот сам пример:

terraform {
  required_providers {
    twc = {
      source = "tf.timeweb.cloud/timeweb-cloud/timeweb-cloud"
    }
  }
  required_version = ">= 0.13"
}

data "twc_configurator" "configurator" {
  location = "ru-1"
  disk_type = "nvme"
}

data "twc_os" "os" {
  name = "ubuntu"
  version = "22.04"
}

resource "twc_server" "example-server" {
  name = "Example server"
  os_id = data.twc_os.os.id

  configuration {
    configurator_id = data.twc_configurator.configurator.id
    disk = 1024 * 15
    cpu = 1
    ram = 1024
  }
}

Для работы конфигурации требуется, чтобы переменная окружения TWC_TOKEN была определена, либо токен был указан в блоке провайдера.

Проверка корректности конфигурации

Перед применением конфигурации рекомендуется убедиться, что файл написан правильно:

terraform validate

Если ошибок нет, вы увидите сообщение:

Success! The configuration is valid.

Как запускать Terraform

Инициализация

terraform init

Terraform скачает провайдеры и подготовит проект.

Просмотр плана

terraform plan

Здесь вы увидите, какие ресурсы будут созданы.

Применение конфигурации

terraform apply

После подтверждения Terraform создаст инфраструктуру и выведет IP-адрес машины.

Управление состоянием (state)

Файл terraform.tfstate — сердце проекта. Он содержит текущее состояние инфраструктуры. Несколько важных моментов:

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

Если вас несколько, используйте удалённый backend:

  • AWS S3
  • Google Cloud Storage
  • Yandex Object Storage
  • HashiCorp Consul
  • Terraform Cloud

Пример удалённого backend через S3:

terraform {
  backend "s3" {
    bucket = "terraform-state-prod"
    key    = "state/yc/production.tfstate"
    region = "us-east-1"
  }
}

Чем можно управлять с помощью Terraform

Terraform позволяет описывать:

  • виртуальные машины;
  • Kubernetes-кластеры;
  • сетевые правила и маршруты;
  • балансировщики нагрузки;
  • базы данных;
  • очереди сообщений;
  • Object Storage;
  • DNS-записи;
  • VPN-туннели;
  • серверless-функции;
  • мониторинг и алерты.

Более 200+ провайдеров доступны из коробки.

Преимущества использования Terraform

1. Повторяемость и предсказуемость

Инфраструктура создаётся одинаково на любом окружении — dev, stage, prod.

2. Хранение инфраструктуры в Git

Весь код хранится в репозитории, инфраструктурные изменения проходят ревью.

3. Безопасные изменения

terraform plan всегда показывает, что именно будет создано или уничтожено.

4. Лёгкость масштабирования

Можно скопировать модуль и развернуть новую инфраструктуру за минуты.

5. Модульность

Terraform поддерживает модули — наборы заранее подготовленных конфигов.

Рекомендации для продакшена

  • используйте удалённый backend (S3/GCS/Object Storage);
  • включайте блокировки state (DynamoDB/Consul);
  • разбивайте инфраструктуру на модули;
  • храните провайдеры и версии в required_providers;
  • никогда не редактируйте terraform.tfstate вручную.
11 минут чтения
Средний рейтинг статьи — 4.9

Настроить мониторинг за 30 секунд

Надежные оповещения о даунтаймах. Без ложных срабатываний