А вы могли бы стать белым хакером? А вы могли бы стать белым хакером? А вы могли бы стать белым хакером? А вы могли бы стать белым хакером? Узнать ответ
Код
#статьи

Что такое Terraform и зачем он нужен

Экспресс-доставка инфраструктуры в облако с помощью кода.

Иллюстрация: Polina Vari для Skillbox Media

Современные приложения редко состоят из одного сервера. Даже небольшой онлайн-сервис может использовать несколько машин, базы данных, хранилища и сетевые настройки. Настраивать такую инфраструктуру вручную долго, сложно и рискованно, особенно когда проект растёт и изменения нужно быстро повторять в разных окружениях.

Terraform позволяет превратить инфраструктуру в код: описать нужные ресурсы один раз и разворачивать их автоматически. В этой статье мы разберём, что такое Terraform, как он работает, как его установить, как создать первый проект и какие реальные задачи с его помощью можно решать.

Содержание


Простыми словами: что такое Terraform

Terraform — инструмент для управления инфраструктурой с помощью кода, или Infrastructure as Code (IaC). Вместо того чтобы вручную создавать и настраивать серверы, сети, базы данных и другие ресурсы, инженер описывает в конфигурации, какой должна быть инфраструктура, а Terraform приводит её к заданному состоянию.

Инструмент в первую очередь используют DevOps-инженеры, которые отвечают за развёртывание и стабильную работу инфраструктуры. Terraform также помогает разработчикам создавать окружения для приложений, а системным администраторам — управлять серверами и облачными ресурсами.

Terraform работает с AWS, Azure, Google Cloud, Kubernetes и множеством других платформ через специальные плагины — провайдеры. Поэтому одним инструментом можно управлять инфраструктурой сразу в нескольких облаках и сервисах.

По сравнению с другими IaC-инструментами, такими как Ansible или CloudFormation Terraform выигрывает благодаря универсальности и поддержки всех основных провайдеров. Сейчас Terraform — стандарт индустрии для управления облачной инфраструктурой.

Для чего нужен Terraform

Главная задача Terraform — помогать инженерам быстро и безошибочно настраивать инфраструктуру. Например, для запуска нового веб-приложения можно заранее указать необходимый сервер, базу данных и хранилище, после чего инструмент подготовит всё за несколько команд.

Вот что можно делать с его помощью:

  • Создавать инфраструктуру в облаках. Например, быстро запустить виртуальный сервер в AWS, Azure или Google Cloud, настроить базу данных или подключить хранилище.
  • Автоматизировать рутинные задачи. Вместо десятков ручных действий инженер запускает один набор команд и получает готовую инфраструктуру.
  • Создавать одинаковые окружения для разработки, тестирования и продакшена. Например, команда может подготовить отдельный сервер для проверки новой функции, а затем развернуть такую же конфигурацию для пользователей.
  • Управлять всей инфраструктурой из одного места. Код Terraform хранится в файлах, поэтому изменения легко отслеживать, проверять и повторять.
  • Уменьшать количество ошибок в проектах. Настраивая инфраструктуру вручную, инженер может случайно пропустить важный шаг. Terraform выполняет инструкции одинаково каждый раз.

Подробнее о преимуществах такого подхода поговорим в следующем разделе.

Преимущества модели Infrastructure as Code

Подход Infrastructure as Code позволяет управлять инфраструктурой так же, как обычным программным кодом: хранить конфигурации в Git, проверять изменения и воспроизводить одинаковые окружения. Это снижает зависимость от ручной настройки и уменьшает риск ошибок.

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

resource "aws_instance" "example" {
  count         = 10
  ami           = "ami-0a91ce6b7a11ff703"
  instance_type = "t3.small"
}

Terraform сравнит описанное состояние с текущей инфраструктурой и создаст только недостающие пять серверов, а не будет разворачивать всё окружение заново.

У IaC есть и другие преимущества:

  • Одну конфигурацию можно использовать для тестов и продакшена.
  • Конфигурации хранятся в системе контроля версий, поэтому видно, кто и что изменил.
  • Если инфраструктуру нужно развернуть заново, её можно восстановить на основе тех же конфигурационных файлов.

Благодаря IaC инфраструктура становится предсказуемее: изменения можно заранее проверить, повторить в другом окружении или при необходимости вернуть предыдущую версию конфигурации.

Как устроен Terraform

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

В основе Terraform четыре компонента:

  • Провайдеры связывают Terraform с внешними платформами и сервисами — например, AWS, Google Cloud, Azure или Kubernetes.
  • Конфигурации описывают инфраструктуру на языке HCL (HashiCorp Configuration Language).
  • Файл состояния хранит сведения о ресурсах, которыми управляет Terraform, и помогает сопоставлять конфигурацию с реальной инфраструктурой.
  • Модули позволяют объединять связанные ресурсы в переиспользуемые блоки и не дублировать одну и ту же конфигурацию.

Например, в конфигурации ниже подключается провайдер AWS и описывается виртуальная машина EC2:

provider "aws" {
  region = "eu-central-1"
}

resource "aws_instance" "web_server" {
  ami           = "AMI_ID"
  instance_type = "t3.micro"

  tags = {
    Name = "WebServer"
  }
}

Блок provider сообщает Terraform, что работать нужно с AWS в регионе eu-central-1. Блок resource описывает виртуальную машину, которую нужно создать. Вместо AMI_ID указывают идентификатор подходящего образа операционной системы для выбранного региона.

Далее работа с Terraform строится вокруг нескольких основных команд:

  • terraform init — подготавливает проект к работе: загружает необходимые провайдеры и модули и создаёт служебные файлы.
  • terraform plan — сравнивает конфигурацию с текущим состоянием инфраструктуры и показывает план изменений. На этом этапе можно заранее увидеть, какие ресурсы Terraform собирается создать, изменить или удалить.
  • terraform apply — применяет этот план и приводит инфраструктуру к состоянию, описанному в конфигурации.
  • terraform destroy — используется для удаления управляемой инфраструктуры. Команда строит план удаления ресурсов и после подтверждения выполняет его.

Если конфигурацию изменить и снова выполнить terraform plan и terraform apply, Terraform определит разницу между текущим и желаемым состоянием и внесёт только необходимые изменения. Например, при изменении типа виртуальной машины он не станет заново создавать всю инфраструктуру, если этого не требует конкретный ресурс.

Чтобы отслеживать состояние ресурсов, Terraform использует файл terraform.tfstate. В нём хранится техническая информация о созданной инфраструктуре: идентификаторы ресурсов, их параметры и связи. Обычно редактировать этот файл вручную не нужно: Terraform обновляет его самостоятельно после операций с инфраструктурой.

В небольшом проекте все ресурсы можно описать в нескольких TF-файлах. В крупных конфигурациях код обычно разбивают на модули. Например:

.
├── modules
│   ├── database
│   │   ├── main.tf
│   │   └── variables.tf
│   └── web
│       ├── main.tf
│       └── variables.tf
└── environments
    ├── dev
    │   └── main.tf
    └── prod
        └── main.tf

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

Как установить Terraform

Terraform распространяется как консольная программа для Windows, macOS и Linux. Установить её можно вручную или через пакетный менеджер. Актуальные версии и инструкции для разных операционных систем доступны на официальном сайте Terraform.

Установка на macOS

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

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Затем добавьте официальный репозиторий HashiCorp:

brew tap hashicorp/tap

Далее запустите установку Terraform:

brew install hashicorp/tap/terraform

Homebrew сам разместит исполняемый файл в нужной директории и настроит окружение.

Установка на Windows

Скачайте ZIP-архив с официального сайта Terraform. Выберите сборку, подходящую для архитектуры компьютера, и распакуйте архив. Внутри находится единственный исполняемый файл terraform.exe.

Создайте новую папку в корне диска и переместите в неё исполняемый файл, а затем добавьте папку в системную переменную PATH. Благодаря этому команду terraform можно будет запускать из PowerShell или командной строки независимо от текущей директории.

Установка на Linux

В Linux Terraform удобнее устанавливать из официального репозитория HashiCorp. Сначала установите необходимые пакеты:

sudo apt-get update
sudo apt-get install -y gnupg software-properties-common

Добавьте GPG-ключ HashiCorp:

wget -O- https://apt.releases.hashicorp.com/gpg | \
gpg --dearmor | \
sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg > /dev/null

Затем добавьте репозиторий HashiCorp:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list

Обновите список пакетов и установите Terraform:

sudo apt update
sudo apt-get install terraform

Весь процесс установки можно упаковать в одну команду. Скопируйте её и выполните в терминале:

wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform

Как пользоваться Terraform

Разберём базовый цикл работы с Terraform на простом примере: запустим локальный веб-сервер Nginx в Docker. В результате на компьютере появится работающий контейнер, который можно открыть в браузере, а затем изменить и удалить с помощью Terraform.

Шаг 1. Устанавливаем Docker

В этом примере Terraform будет управлять не облачной инфраструктурой, а локальным Docker Engine. Поэтому на компьютере должен быть установлен и запущен Docker.

Для Windows и macOS проще всего использовать Docker Desktop. Скачайте с официального сайта установщик для вашей операционной системы, запустите его и следуйте инструкциям на экране.

После установки проверьте работу Docker, выполнив в терминале команду docker version. В ответ должны появиться версии Docker Client и Docker Server.

Скриншот: Docker / Skillbox Media

Шаг 2. Создаём проект

Создайте папку проекта на рабочем столе с помощью интерфейса операционной системы или выполните команду mkdir -p ~/Desktop/terraform-nginx. После этого откройте папку в терминале с помощью команды cd ~/Desktop/terraform-nginx.

Скриншот: macOS / Skillbox Media

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

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 4.5"
    }
  }
}

provider "docker" {}

resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}

resource "docker_container" "nginx" {
  name  = "terraform-nginx"
  image = docker_image.nginx.image_id

  ports {
    internal = 80
    external = 8080
  }
}

В конфигурации описаны два ресурса: образ nginx:latest и контейнер, который будет запущен на его основе. Порт 80 внутри контейнера связан с портом 8080 компьютера, поэтому сайт будет доступен по адресу localhost:8080. Провайдер kreuzwerker/docker позволяет Terraform создавать и управлять Docker-образами и контейнерами.

На Windows может потребоваться явно указать Docker Engine в блоке провайдера:

provider "docker" {
  host = "npipe:////.//pipe//docker_engine"
}

Шаг 3. Инициализируем проект

Теперь нужно подготовить директорию к работе. Для этого выполните в терминале команду terraform init.

Terraform найдёт в main.tf Docker-провайдер, загрузит его и создаст служебную директорию .terraform. Также появится файл .terraform.lock.hcl, в котором фиксируется выбранная версия провайдера.

В конце должно появиться сообщение Terraform has been successfully initialized. Если всё получилось, то проект готов к работе.

Скриншот: Terraform / Skillbox Media

С помощью команды terraform validate можно проверить перед запуском, нет ли в файле ошибок. Если конфигурация корректна, Terraform сообщит: Success! The configuration is valid.

Дополнительно можно автоматически привести файлы к стандартному форматированию командой terraform fmt.

Шаг 4. Проверяем план изменений

Теперь попросим Terraform показать, что он собирается сделать. Для этого выполним команду terraform plan.

Terraform сравнит конфигурацию с текущим состоянием и составит план. Поскольку мы запускаем проект впервые, в конце будет примерно такой результат:

Plan: 2 to add, 0 to change, 0 to destroy.
Скриншот: Terraform / Skillbox Media

Два новых ресурса — это Docker-образ Nginx и контейнер. Знак + рядом с ресурсом в полном выводе terraform plan означает его создание. На этом этапе никаких изменений ещё не происходит, поэтому план можно спокойно изучить и при необходимости исправить конфигурацию.

Шаг 5. Запускаем Nginx

Если план выглядит правильно, примените его, выполнив команду terraform apply. Terraform ещё раз покажет запланированные изменения и запросит подтверждение. Введите в терминале yes, чтобы подтвердить.

После этого Terraform скачает образ Nginx и создаст контейнер. В конце появится сообщение:

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Скриншот: Terraform / Skillbox Media

Одновременно с этим Terraform создаст файл terraform.tfstate. Там хранится информация о ресурсах, которыми он управляет, например идентификаторы и параметры созданного контейнера.

Теперь откройте в браузере http://localhost:8080. Если всё прошло успешно, появится стандартная страница Nginx. Это значит, что инфраструктура, описанная в main.tf, действительно запущена.

Скриншот: Nginx / Skillbox Media

Шаг 6. Изменяем инфраструктуру

Теперь посмотрим, что произойдёт при изменении конфигурации. В main.tf найдите внешний порт external = 8080 и замените его на external = 8081. Снова выполните terraform plan.

Terraform обнаружит разницу между конфигурацией и существующей инфраструктурой. Docker не позволяет изменить опубликованный порт уже созданного контейнера, поэтому Terraform покажет, что контейнер придётся удалить и создать заново:

Plan: 1 to add, 0 to change, 1 to destroy.
Скриншот: Terraform / Skillbox Media

Примените изменение с помощью команды terraform apply и подтвердите его словом yes. Terraform самостоятельно пересоздаст контейнер с новой настройкой. После этого Nginx будет доступен уже по адресу http://localhost:8081.

Скриншот: Nginx / Skillbox Media

Шаг 7. Удаляем созданные ресурсы

Когда сервер больше не нужен, его можно удалить вместе со всеми ресурсами из этой конфигурации. Для этого запустите команду terraform destroy.

Terraform сначала покажет план удаления и попросит подтверждения. После ввода yes система удалит контейнер.

Destroy complete! Resources: 2 destroyed.
Скриншот: Terraform / Skillbox Media

Полезные материалы

Terraform — большой и сложный инструмент. После знакомства с основами стоит изучить работу с провайдерами, модулями, состоянием, безопасностью и автоматизацией CI/CD. Ниже — подборка ресурсов, которые помогут разобраться с расширенными возможностями системы.

  • Официальная документация Terraform — главный источник информации о Terraform. Здесь описаны все возможности инструмента: синтаксис HCL, команды CLI, провайдеры, модули, управление состоянием и рекомендации по организации проектов.
  • Terraform Tutorials — практические руководства от разработчиков Terraform с пошаговыми примерами.
  • «Terraform: инфраструктура на уровне кода», Евгений Брикман, — одна из самых популярных книг по Terraform. Она объясняет не только синтаксис инструмента, но и принципы Infrastructure as Code.
  • Learn Terraform от freeCodeCamp — большой бесплатный видеокурс по Terraform для начинающих.

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

Главное при изучении Terraform — не просто запоминать команды, а понимать подход Infrastructure as Code: описывать инфраструктуру в коде, версионировать изменения и создавать воспроизводимые окружения.

Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!

Станьте DevOps-инженером за 7 месяцев
Попробуйте себя в ИТ-профессии, пройдите стажировку в Yandex Cloud и отточите навыки на реальных проектах.
Узнать как
Попробуйте себя в DevOps
На курсе Skillbox вы с нуля освоите востребованное направление и изучите актуальные инструменты DevOps-инженера.
Подробнее

Изучайте IT на практике — бесплатно

Курсы за 2990 0 р.

Я не знаю, с чего начать
Практический курс: «Профессия DevOps-инженер» Узнать о курсе
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована