Что делает
Создаёт и обновляет облачную инфраструктуру (EC2, RDS, VPC, DNS) по декларативному описанию в HCL-файлах: terraform plan показывает план изменений, terraform apply применяет их.
Terraform — инструмент Infrastructure as Code для декларативного описания облачной инфраструктуры. Стандарт DevOps-инженера для управления AWS, GCP и Azure: в вакансиях чаще всего рядом с Kubernetes и Ansible.
Terraform — инструмент Infrastructure as Code (IaC) от HashiCorp, позволяющий описывать инфраструктуру (серверы, сети, базы данных, DNS) декларативно в файлах HCL (HashiCorp Configuration Language). Вместо ручного создания ресурсов через консоль или shell-скрипты инженер описывает желаемое конечное состояние, Terraform вычисляет разницу с текущим и применяет только необходимые изменения.
Ключевая концепция — tfstate-файл, база данных реального состояния инфраструктуры. В команде tfstate хранится в remote backend (S3, GCS, Terraform Cloud), что предотвращает конфликты. На рынке труда Terraform — почти исключительно DevOps-навык: подавляющее большинство вакансий с ним приходится на роли DevOps-инженера и SRE.
Создаёт и обновляет облачную инфраструктуру (EC2, RDS, VPC, DNS) по декларативному описанию в HCL-файлах: terraform plan показывает план изменений, terraform apply применяет их.
DevOps-инженеры, SRE и Platform Engineer: Terraform применяется для управления инфраструктурой AWS, GCP и Azure, настройки Kubernetes-кластеров и сетевых конфигураций.
Ядро DevOps-стека. Доминирующая роль — DevOps-инженер; в парах чаще всего Kubernetes, Ansible и облачные платформы.
Terraform — инструмент декларативного управления инфраструктурой от HashiCorp с открытым исходным кодом. Конфигурация пишется на HCL: разработчик описывает ресурсы (aws_instance, google_sql_database, kubernetes_deployment), Terraform при выполнении terraform apply создаёт их через API провайдера. Ключевое отличие от Ansible и shell-скриптов — идемпотентность: повторный apply с той же конфигурацией не создаёт дубликаты, а сверяет текущее состояние с желаемым.
После каждого apply Terraform сохраняет актуальное состояние всех ресурсов в terraform.tfstate — JSON-файл с ID, атрибутами и зависимостями каждого ресурса. При следующем apply Terraform сравнивает конфигурацию с tfstate и API провайдера, вычисляя минимальный план изменений. Локальный tfstate в команде — критический риск: два инженера одновременно могут перезаписать состояние и потерять синхронизацию с реальной инфраструктурой.
Remote backend хранит tfstate централизованно: S3 с блокировкой через DynamoDB (AWS), GCS (GCP), Terraform Cloud. State locking (блокировка) гарантирует, что только один оператор в момент времени может менять инфраструктуру — предотвращает конфликты при параллельной работе. Remote backend — обязательный элемент Terraform в командной работе.
От конфига до реального ресурса в облаке — стандартный рабочий процесс.
Написать конфигурацию HCL
Описать ресурсы в .tf-файлах: провайдер, переменные, resource-блоки. terraform fmt форматирует, terraform validate проверяет синтаксис.
terraform plan
Terraform читает tfstate, опрашивает API провайдера и вычисляет минимальный план изменений: + создать, ~ изменить, - удалить. Это можно ревьюить в PR.
terraform apply
После подтверждения Terraform вызывает API провайдера, создаёт/изменяет ресурсы в нужном порядке и обновляет tfstate с актуальными атрибутами.
Terraform переносится между ролями: DevOps-инженер, SRE-инженер, Системный администратор. В одном треке этот навык может быть основным рабочим инструментом, а в другом - сильным прикладным усилителем основной специализации.
DevOps-инженер — самый заметный профиль в распределении ролей по навыку.
Ещё 7 ролей используют Terraform
Текущий срез показывает активные вакансии сейчас. Распределение по ролям рассчитано по расширенной исторической выборке, поэтому значения могут быть выше текущего количества активных вакансий.
Terraform ценен не абстрактным знанием инструмента, а повторяющимися рабочими задачами — ниже они разобраны так, как встречаются в реальной работе.
Первый ресурс AWS
Создать EC2-инстанс с провайдером AWS — базовая структура Terraform-проекта.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = var.region
}
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = var.instance_type
tags = {
Name = "web-server"
Environment = var.environment
}
} Переменные и валидация
Описать входные параметры модуля с типами, значениями по умолчанию и валидацией.
# variables.tf
variable "instance_type" {
type = string
default = "t3.micro"
description = "Тип EC2-инстанса"
}
variable "environment" {
type = string
validation {
condition = contains(
["dev", "staging", "prod"],
var.environment
)
error_message = "Только dev, staging или prod."
}
} Output values
Экспортировать ID и IP созданных ресурсов для использования в других модулях или CI/CD.
# outputs.tf
output "instance_id" {
description = "ID EC2-инстанса"
value = aws_instance.web.id
}
output "public_ip" {
description = "Публичный IP веб-сервера"
value = aws_instance.web.public_ip
sensitive = false
}
output "private_ip" {
description = "Приватный IP (для внутренней сети)"
value = aws_instance.web.private_ip
} Вызов модуля из реестра
Использовать готовый VPC-модуль из Terraform Registry вместо описания всех ресурсов вручную.
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.1.0"
name = "main-vpc"
cidr = "10.0.0.0/16"
azs = ["eu-central-1a", "eu-central-1b"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24"]
enable_nat_gateway = true
}
output "vpc_id" {
value = module.vpc.vpc_id
} Remote backend на S3
Настроить хранение tfstate в S3 с блокировкой через DynamoDB для командной работы.
terraform {
backend "s3" {
bucket = "my-tfstate-bucket"
key = "prod/main/terraform.tfstate"
region = "eu-central-1"
dynamodb_table = "terraform-state-locks"
encrypt = true
}
} Data source для AMI
Найти последний Ubuntu-образ через data source вместо хардкода AMI-ID, который устаревает.
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"] # Canonical
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-22.04-amd64-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
}
resource "aws_instance" "web" {
ami = data.aws_ami.ubuntu.id
instance_type = var.instance_type
} Коммитить terraform.tfstate в git или оставлять его локальным при командной работе. Два инженера с разными локальными state создадут дублирующиеся ресурсы или потеряют синхронизацию. Обязателен remote backend с блокировкой.
Писать пароли БД, API-ключи и токены прямо в переменных или resource-атрибутах. Secrets должны поступать из переменных среды (TF_VAR_db_password), HashiCorp Vault или AWS Secrets Manager — никогда из .tf или .tfvars, попадающих в git.
Выполнять terraform apply без предварительного review плана. Plan может показать неожиданные удаления ресурсов из-за изменения имени или типа. В production — всегда plan + ревью, затем apply.
Дублировать одинаковые блоки ресурсов для dev и prod вместо создания модуля с переменными. При изменении архитектуры придётся менять копии в нескольких местах — источник расхождений конфигураций окружений.
Не указывать depends_on когда Terraform не может автоматически определить зависимость между ресурсами (например, resource и data source в разных модулях). Результат — apply в неправильном порядке и ошибки создания.
DevOps-инженер — доминирующая роль в вакансиях с Terraform, следом SRE. Это второй по частоте IaC-инструмент после Ansible на российском рынке, но растёт он быстрее: облачная миграция компаний создаёт спрос на декларативное управление AWS и GCP. В парах чаще всего Kubernetes, Ansible и GitLab CI.
Terraform востребован там, где инструмент реально ускоряет повторяемые задачи команды, а не существует отдельной теорией.
Спрос держится дольше, когда навык нужен не эпизодически, а как часть ежедневного цикла разработки, проверки или доставки.
Terraform чаще ищут там, где процесс уже стандартизирован и без этого инструмента команда теряет скорость и предсказуемость.
Terraform формирует устойчивый спрос внутри своего рабочего сегмента.
Terraform сохраняет устойчивый прикладной спрос на рынке: 235 активных вакансий, #72 по рынку, 3.4% IT-вакансий. Ниже показано число открытых вакансий на конец каждого месяца: это исторический ряд по состоянию на конец месяца, а не текущий срез рынка на сегодня.
#72 по рынку • 3.4% IT-вакансий
-32 вакансий и -10% к предыдущему месяцу.
Terraform спрашивают с DevOps-инженеров и SRE — ролей с одними из самых высоких медиан на рынке. Отдельно инструмент не тарифицируется, но облачная специализация ценится выше классического конфигурационного управления; доход растёт с...
47 вакансий с зарплатой в расширенной зарплатной выборке
Коридор появится, когда по грейдам наберётся достаточная выборка.
Senior - основной уровень рынка (59%)
Terraform редко живёт изолированно: чаще всего рынок видит его рядом с Kubernetes, Ansible, CI/CD. Самая плотная связка сейчас - Kubernetes: оба навыка встречаются вместе в 87% вакансий.
Главная связка: Kubernetes • 87% вакансий. Показываем общерыночные связки Terraform: не junior-минимум из блока выше, а навыки, которые чаще всего встречаются рядом с ним в одной вакансии.
навыки, которые рынок чаще всего видит рядом в одной вакансии
не базовый минимум, а более сильные комбинации стека
Сейчас на рынке 7 активных junior-вакансий с Terraform. Это 3.8% всех вакансий по навыку, поэтому для старта важнее всего смотреть на реальный объём junior-окна и на стек, который рынок ждёт рядом.
3.8% всех вакансий по навыку • Senior / Junior 15.6x
Окно входа узкое: рынок чаще нанимает с опытом.
Медианная вакансия с Terraform ожидает около 20 навыков в стеке. Это широкий стартовый набор: рынок обычно ищет не один изолированный инструмент, а рабочую комбинацию соседних навыков.
В резюме нужно не просто указать «Terraform», а показать уровень: умеете ли вы писать модули, настраивать удалённый бэкенд, работать с state и CI/CD.
Стандартные пары Terraform в production-инфраструктуре.
Terraform создаёт managed-кластеры EKS/GKE и базовые дополнения
При развёртывании кластера как части инфраструктуры
Деплой приложений в кластер — задача GitOps-инструментов, не Terraform.
Конфигурация ОС и приложений на созданных Terraform серверах
Когда после создания ВМ нужно установить и настроить ПО
Не отслеживает состояние ресурсов — идемпотентность на уровне задач, не инфраструктуры.
Облачные платформы — основные провайдеры Terraform
Любая облачная инфраструктура под управлением кода
Специфичные новинки облака попадают в провайдер с задержкой.
Автоматический plan в merge request и apply после апрува
Когда изменения инфраструктуры должны проходить ревью
Нужно продумать хранение облачных креденшалов в CI.
Установка Kubernetes-приложений через helm_release
Для базовых кластерных сервисов (ingress, cert-manager)
Прикладные релизы через Terraform быстро становятся неудобными — лучше ArgoCD.
Terraform применяется везде, где инфраструктура создаётся программно: облачные серверы, Kubernetes-кластеры, сетевые конфигурации и управляемые сервисы.
Облачная инфраструктура AWS: VPC, подсети, security groups, EC2-инстансы, RDS и S3-бакеты описываются в .tf-файлах; terraform apply создаёт всё окружение за минуты,...
Kubernetes-кластер EKS/GKE: Terraform создаёт managed Kubernetes через terraform-aws-modules/eks и устанавливает дополнения (ingress-controller, cert-manager) через...
Управление средами: modules/ описывает общие ресурсы, environments/dev и environments/prod вызывают одни и те же модули с разными переменными — гарантированная...
Terraform заметен в 2 направлениях рынка с долей выше 5%.
Ключевые возможности инструмента для декларативного управления инфраструктурой.
Описываешь желаемое конечное состояние, Terraform вычисляет разницу с текущим и применяет только необходимые изменения — без ручного управления порядком создания ресурсов.
AWS, GCP, Azure, Kubernetes, GitHub, Datadog, Cloudflare и тысячи других сервисов управляются из одного инструмента через единый HCL-синтаксис.
terraform plan показывает точный список изменений до применения — инфраструктурные изменения можно ревьюить в Pull Request так же, как изменения кода.
Модули из Terraform Registry (VPC, EKS, RDS) избавляют от написания сотен строк конфигурации с нуля — переиспользуемые, протестированные блоки IaC.
Три популярных IaC-инструмента — у каждого своя роль в DevOps-стеке.
Это не конкуренты, а связка: Terraform создаёт и удаляет облачные ресурсы (серверы, сети, базы), Ansible настраивает то, что уже создано — пакеты, конфиги, сервисы. Типичный production-процесс:...
Pulumi описывает инфраструктуру на Python, TypeScript или Go — с циклами, функциями и тестами обычного языка. Terraform с его декларативным HCL проще для инженеров эксплуатации и имеет больше готовых...
CloudFormation — родной IaC AWS: глубокая интеграция, но только одно облако и многословный YAML/JSON. Terraform работает с тысячами провайдеров единым языком. Для AWS-only команд оба варианта...
Работа с Terraform включает: workspace для изоляции окружений, state — сердце инструмента, и модули для переиспользования. Ниже — ключевые элементы типового проекта.
Механизм изоляции окружений (dev/предрелизное/prod) внутри одной конфигурации. Команды `terraform workspace new` и `select` переключают контекст.
Файл `terraform.tfstate` содержит атрибуты всех созданных ресурсов. Хранить удалённо: S3 с нативной блокировкой (use_lockfile = true, Terraform 1.11+) или Terraform Cloud — для командной работы.
Переиспользуемые блоки ресурсов. Например, модуль VPC скрывает десятки ресурсов за простым интерфейсом cidr_block и subnet_count.
Переменные делают конфигурацию гибкой (регион, размер). Output выводит IP, URL и другие значения после apply.
Место хранения state: локально, S3, Terraform Cloud, GitLab. Выбор backend влияет на безопасность и коллаборацию.
Используйте remote backend с блокировкой, не храните state в Git, внедряйте plan-ревью через Pull Request.
Разбивайте инфраструктуру на переиспользуемые модули: VPC, Network, Compute. Реестр модулей Terraform Registry — готовые решения для типовых сценариев.
Никогда не храните `terraform.tfstate` в Git. Используйте S3 с нативной блокировкой (use_lockfile = true, Terraform 1.11+) или Terraform Cloud — DynamoDB для этого больше не обязателен.
Всегда запускайте `terraform plan` перед `apply`. Для CI/CD — генерируйте план как артефакт и утверждайте его через PR.
Фиксируйте версии провайдеров в `required_providers` для воспроизводимости. Обновляйте их осознанно.
Массовое создание ресурсов через `count` и `for_each` усложняет state и логику изменений. Используйте модули для группировки.
Применяйте `terraform fmt -recursive` для единого стиля и `terraform validate` для проверки синтаксиса.
Используйте отдельные корневые конфигурации или workspaces для dev, предрелизного и prod. Не смешивайте state-файлы.
Пишите описание переменных, outputs и примеры использования в README модуля. Это упрощает командную работу и онбординг.
Для обмена данными между конфигурациями применяйте data-источник `terraform_remote_state` — это безопаснее, чем жёстко закодированные ID.
Не храните пароли, токены и ключи в файлах .tf и переменных. Используйте Vault, AWS Secrets Manager или переменные CI/CD.
Файл `terraform.tfstate` содержит все атрибуты ресурсов, включая пароли. Никогда не добавляйте его в Git.
Не указывайте access_key/secret_key в коде. Используйте AWS IAM roles, профили или OIDC для CI/CD.
Работа без блокировки state при командном apply приводит к конфликтам и повреждению файла. Всегда настраивайте блокировку: нативный S3-lock (use_lockfile, Terraform 1.11+) или Terraform Cloud.
Инфраструктура может быть изменена вручную через консоль. Регулярно запускайте `terraform plan` или используйте дрифт-детекторы.
IAM-роль для Terraform должна иметь минимальные разрешения (least privilege). Не используйте admin-роль.
Фиксируйте версию провайдера в `required_providers`. `latest` может содержать несовместимые изменения.
Локальный state-файл хранится с открытыми данными. Для production используйте удалённый бэкенд с шифрованием.
Вносите изменения через Pull Request с `terraform plan` в CI/CD. Никто не должен выполнять `apply` напрямую.
Перспективы Terraform завязаны не только на текущем спросе, но и на том, как навык встраивается в новые платформы, инструменты и рабочие контуры.
После смены лицензии Terraform на BSL в 2023 году сообщество создало OpenTofu — полностью совместимый форк под лицензией MPL. OpenTofu входит в Linux Foundation; некоторые...
CDK for Terraform (CDKTF) позволяет писать конфигурацию на TypeScript, Python или Go вместо HCL, генерируя стандартный Terraform JSON. Объединяет типобезопасность языков...
Terraform Cloud и Atlantis добавляют автоматическое обнаружение drift: если кто-то изменил ресурс через консоль, CI создаёт алерт и план исправления. Это закрывает главный...
Terraform-проект для двух окружений (dev/prod): VPC через terraform-aws-modules/vpc, EC2 с ALB, RDS PostgreSQL, remote backend на S3+DynamoDB, GitLab CI с plan в MR и apply при merge.
Создание EKS-кластера через terraform-aws-modules/eks: node groups, IRSA для pod identity, установка ingress-controller и cert-manager через helm_release. Все настройки в переменных.
Terraform осваивается поэтапно: базовый синтаксис за несколько дней, remote state и модули — за неделю, production-паттерны (Terragrunt, модульная архитектура) — за месяц практики.
HCL-синтаксис и первый ресурс
Освоить блоки resource, variable, output, data. Начать с провайдера null или random — без реального облака и без затрат: terraform init → plan → apply →...
AWS-ресурсы и первая инфраструктура
Создать EC2-инстанс, VPC и security group в AWS Free Tier. Понять зависимости между ресурсами через ссылки (aws_instance.web.id) и depends_on.
Remote backend и командная работа
Настроить S3-backend с DynamoDB-блокировкой. Это обязательный шаг перед работой в команде — без remote backend tfstate будет конфликтовать при...
Переменные и outputs
Вынести настраиваемые параметры в variables.tf, добавить outputs.tf для экспорта ID ресурсов. Использовать terraform.tfvars для env-специфичных значений.
Соответствие — доля тем навыка, которые охватывает программа курса
Трёхшаговый путь от нуля до production IaC.
Установить Terraform CLI, пройти официальный Get Started на developer.hashicorp.com/terraform/tutorials — использовать провайдер docker или null без облачного аккаунта.
Зарегистрировать AWS-аккаунт, создать EC2 + VPC через Terraform, настроить S3-backend. Это первый production-паттерн, который используется в реальных проектах.
Для инструментов вроде Terraform на одной странице полезно держать и объяснение роли на рынке, и быстрые переходы к официальным ресурсам.
Официальный портал Terraform от HashiCorp.
Официальные туториалы: от установки до модулей и remote state.
Справочник по HCL: ресурсы, переменные, модули, функции.
Каталог провайдеров и готовых модулей.
Официальный раздел про remote backend и блокировки state.
Tfstate — JSON-файл с актуальным состоянием всех ресурсов, управляемых Terraform: ID, атрибуты, зависимости. Без tfstate Terraform не знает, что уже создано, и при следующем apply попытается создать ресурсы заново — дублирование или ошибки. Удаление state без импорта ресурсов обратно лишает Terraform возможности управлять ими.
Локальный tfstate — критический риск в команде: два инженера с разными копиями state создадут конфликты. Remote backend (S3 + DynamoDB) хранит единственную копию state в облаке и блокирует параллельный apply — только один оператор может менять инфраструктуру в момент времени.
Terraform управляет инфраструктурой (создаёт/удаляет облачные ресурсы: серверы, сети, базы данных). Ansible конфигурирует ОС и приложения на уже существующих серверах. В production они работают вместе: Terraform создал сервер → Ansible установил nginx и приложение.
Использовать провайдер null или random для практики синтаксиса без создания реальных ресурсов. Для AWS — Free Tier с t3.micro инстансами (бесплатно 12 месяцев). Для локальной практики — Terraform с LocalStack (mock AWS API).
Модуль — директория с .tf-файлами, описывающая переиспользуемый набор ресурсов. Принимает input variables, возвращает outputs. Позволяет создавать одинаковую инфраструктуру для dev и prod с разными переменными из одного кода. Публичные модули доступны на registry.terraform.io.
Никогда не хардкодить в .tf-файлах и не коммитить в git. Использовать переменные среды (TF_VAR_db_password), AWS Secrets Manager через data source, HashiCorp Vault provider или sensitive = true в variable-блоке чтобы Terraform скрывал значение в выводе.
Terragrunt — обёртка над Terraform для управления многоокружным проектом: устраняет дублирование backend-конфигурации, автоматизирует зависимости между модулями и упрощает работу с иерархией environments/region/module. Используется в enterprise при 5+ окружениях.