Как использовать Terraform для создания инфраструктуры как кода (IaC)
Инфраструктура как код (Infrastructure as Code, IaC) — это подход, при котором серверы, сети, базы данных, облачные ресурсы и другие компоненты описываются в виде конфигурационных файлов, а не настраиваются вручную. Один из самых популярных инструментов для IaC — Terraform. Он позволяет описывать инфраструктуру в декларативной форме и развертывать её одинаково в AWS, Google Cloud, Yandex Cloud, Hetzner, DigitalOcean и десятках других платформ.
В этой статье разберём, как Terraform работает, из чего он состоит, как написать свой первый конфиг и выполнить развертывание.
Что такое Terraform и как он работает
Terraform — это инструмент HashiCorp, который преобразует конфигурационные файлы (с расширением .tf) в реальные инфраструктурные объекты.
Основа работы Terraform:
- Конфигурация — вы описываете, что должно быть создано.
- Планирование (terraform plan) — Terraform анализирует текущее состояние инфраструктуры и формирует список изменений.
- Применение (terraform apply) — Terraform создаёт или изменяет ресурсы.
- Хранение состояния (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 terraformmacOS (Homebrew)
brew tap hashicorp/tap
brew install hashicorp/tap/terraformWindows (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.
Его можно использовать двумя способами:
- Через переменную окружения
export TWC_TOKEN=eyJhbGc...
- Внутри конфигурации 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вручную.
Настроить мониторинг за 30 секунд
Надежные оповещения о даунтаймах. Без ложных срабатываний