🏗️ Terraform: Инфраструктура как код
Кратко: Terraform — это инструмент от HashiCorp, который позволяет описывать инфраструктуру (серверы, сети, базы данных, DNS) в текстовых файлах и разворачивать её одной командой . Вместо того чтобы вручную создавать виртуалки в веб-интерфейсе облака, вы пишете «чертёж» на языке HCL (HashiCorp Configuration Language), запускаете terraform apply — и инфраструктура создаётся сама. Terraform работает с AWS, Google Cloud, Azure, Yandex Cloud, а также с локальными системами (VMware, Kubernetes, Docker) . Это стандарт де-факто для управления облачной инфраструктурой.
🧠 Что такое Infrastructure as Code Представьте, что вам нужно развернуть тестовую среду для нового проекта. Вручную это выглядит так: зайти в консоль AWS, создать VPC, подсети, security groups, поднять EC2, настроить DNS, привязать базу данных. Три часа кликов. Ошибётесь в одном параметре — среда не заработает. Terraform предлагает другой подход. Вы пишете файл:
resource "aws_instance" "web" { ami = "ami-0c55b159cbfafe1f0" instance_type = "t2.micro" }
Запускаете terraform apply — и сервер создан. Завтра нужно десять таких серверов — меняете одну цифру и применяете снова. Всё воспроизводимо, всё в Git, всё предсказуемо .
⚙️ Как устроен Terraform Провайдеры (Providers) — плагины для работы с облаками. Провайдер AWS знает, как создавать EC2, S3, RDS. Провайдер Google Cloud — как создавать Compute Engine, Cloud Storage. Их более 4800 . Ресурсы (Resources) — описание объектов инфраструктуры. Один ресурс = один сервер, одна сеть, одна база данных. Состояние (State) — файл terraform.tfstate, где Terraform хранит информацию о созданных ресурсах. Это «карта памяти»: Terraform смотрит в неё, чтобы понять, что уже создано, а что нужно изменить . План (Plan) — предварительный просмотр того, что будет создано, изменено или удалено. Вы видите terraform plan до того, как что-то сломается .
🛠 Основные команды terraform init — инициализация проекта. Скачивает провайдеры и подготавливает рабочую директорию . terraform validate — проверка синтаксиса конфигурации . terraform plan — показать, что будет сделано. Ничего не меняет, только показывает . terraform apply — применить изменения. Создаёт, обновляет или удаляет ресурсы . terraform destroy — удалить всю инфраструктуру, созданную Terraform . terraform fmt — автоматически отформатировать код по стандарту .
📦 Управление состоянием По умолчанию файл состояния хранится локально. Это плохо для командной работы: два человека запустят apply одновременно — состояние повредится . Решение — удалённый бэкенд. Файл состояния хранится в S3, Azure Blob или Terraform Cloud. Terraform использует блокировку (state locking), чтобы только один процесс мог изменять состояние в момент времени .
Пример бэкенда для AWS S3: terraform { backend "s3" { bucket = "my-terraform-state" key = "prod/terraform.tfstate" region = "eu-west-1" } }
🌍 Реальные кейсы Развёртывание кластера Kubernetes в Yandex Cloud. Модуль создаёт VPC, подсети, мастер-ноду и worker-ноды одной командой. Повторный запуск не дублирует ресурсы, а обновляет только изменения. Управление DNS-записями через Cloudflare. Все записи описаны в коде. Добавили новый сервис — добавили запись в файл, применили. Забыли — plan покажет расхождение. Миграция с ручного управления на IaC. Компании переносят существующую инфраструктуру под Terraform через terraform import, чтобы получить контроль и воспроизводимость.
🎭 Культурный феномен: OpenTofu и смена лицензии В 2023 году HashiCorp изменила лицензию Terraform с MPL 2.0 на Business Source License (BSL). Это ограничило коммерческое использование в SaaS-продуктах . Сообщество отреагировало созданием OpenTofu — форка под управлением Linux Foundation. OpenTofu полностью совместим с Terraform: те же команды, тот же синтаксис, тот же state. Миграция занимает дни, а не недели . OpenTofu добавил то, чего не было в Terraform: встроенное шифрование состояния и поддержку for_each в провайдерах .
Главный вывод: Terraform превращает инфраструктуру в код — воспроизводимый, версионируемый, предсказуемый.