Оглавление

  1. Введение
  2. Основные команды и рабочий процесс
  3. Управление состоянием (State)
  4. Продвинутое управление ресурсами
  5. Модули и масштабирование
  6. Рабочие пространства (Workspaces)
  7. Работа с провайдерами (AWS и GCP)
  8. Отладка и логирование

Введение

Terraform — это инструмент для создания, изменения и улучшения инфраструктуры как кода (IaC).

Эта заметка структурирует концепции мутабельной и иммутабельной инфраструктуры на основе принципов HashiCorp.


Основные команды и рабочий процесс

Фундаментальный цикл работы с Terraform включает несколько ключевых этапов:

  1. terraform init: Инициализация рабочего каталога. Команда скачивает необходимые плагины провайдеров и модули.
  2. terraform validate: Проверка конфигурационных файлов на наличие синтаксических ошибок. Если ошибка есть, команда укажет строку и даст подсказку по исправлению.
  3. terraform fmt: Сканирует файлы и форматирует код в канонический формат для улучшения читаемости.
  4. terraform plan: Генерирует план выполнения, показывая, какие ресурсы будут созданы, изменены или удалены, не внося реальных изменений.
  5. terraform apply: Применяет изменения в инфраструктуре. Перед выполнением требует подтверждения (yes).
  6. terraform destroy: Удаляет все ресурсы, описанные в конфигурации.

Дополнительные команды:

  • terraform show: Выводит текущее состояние инфраструктуры или содержимое state-файла.
  • terraform output: Выводит значения выходных переменных. Можно указать имя конкретной переменной для вывода.
  • terraform providers: Показывает список всех провайдеров, используемых в конфигурации.
  • terraform graph: Создает визуальное представление зависимостей ресурсов в формате DOT.

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

State-файл (terraform.tfstate) — это критически важный компонент, который сопоставляет конфигурацию в коде с реальными ресурсами в облаке.

Команды манипуляции состоянием (terraform state)

  • list: Список всех ресурсов, записанных в файле состояния, в формате тип.имя.
  • show <адрес_ресурса>: Показывает атрибуты конкретного ресурса из состояния.
  • mv <источник> <цель>: Переименовывает ресурс в файле состояния. Важно: после этого нужно вручную изменить имя ресурса в коде.
  • rm <адрес_ресурса>: Удаляет ресурс из управления Terraform, но не уничтожает сам ресурс в облаке.
  • pull: Скачивает файл состояния из удаленного бэкенда на локальную машину.
  • push: Перезаписывает состояние в удаленном бэкенде локальным файлом (требует крайней осторожности и флага -force).

Синхронизация и импорт

  • terraform refresh: Обновляет локальный state-файл в соответствии с реальным состоянием ресурсов в облаке (например, если были ручные изменения вне Terraform).
  • terraform import <адрес_ресурса> <ID_ресурса>: Позволяет взять под управление Terraform ресурсы, созданные вручную или другими инструментами. Команда обновляет только state-файл; блоки ресурсов в коде нужно добавить вручную.

Продвинутое управление ресурсами

Правила жизненного цикла (Lifecycle Rules)

Блок lifecycle внутри ресурса позволяет переопределить стандартное поведение Terraform:

  • create_before_destroy = true: Сначала создает новый ресурс, и только потом удаляет старый (полезно для минимизации простоев).
  • prevent_destroy = true: Запрещает удаление ресурса через terraform apply (защита критических данных, например баз данных).
  • ignore_changes = [атрибуты]: Игнорирует изменения определенных атрибутов (например, тегов), внесенных вручную.

Taint и Untaint

  • terraform taint <адрес_ресурса>: Помечает ресурс как “испорченный”, заставляя Terraform пересоздать его при следующем применении (даже если параметры не менялись).
  • terraform untaint <адрес_ресурса>: Снимает метку “tainted”.

Ephemeral Resources (v1.10+)

Эфемерные блоки предназначены для работы с секретами (паролями, токенами) без сохранения их значений в открытом виде в state-файле.

  • Использование аргументов типа write_only (доступно в v1.11) позволяет передавать данные в ресурсы (например, пароль БД), не записывая их в состояние.
  • Требует указания версии (write_only_version) для отслеживания необходимости обновления секрета.

Terraform Actions (v1.14+)

Блок action позволяет вызывать специфические действия, такие как запуск Lambda-функции или инвалидация кэша CloudFront, после создания или обновления ресурсов.

  • Запуск можно автоматизировать через жизненный цикл ресурса (action_trigger) или вызвать вручную через CLI: terraform apply -invoke=<имя_действия>.

Модули и масштабирование

Модуль — это любая директория с конфигурационными файлами .tf.

  • Root Module: Основная директория, из которой запускаются команды init/apply.
  • Child Module: Модуль, вызываемый из другого модуля для повторного использования кода.
  • Типы источников (Source):
    • Локальные: Указывается путь к папке (например, ./modules/aws_instance).
    • Registry: Использование готовых модулей из Terraform Registry. Рекомендуется всегда указывать версию через аргумент version, чтобы избежать поломок при обновлении модуля.

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


Рабочие пространства (Workspaces)

Рабочие пространства позволяют использовать одну и ту же конфигурацию для управления разными наборами инфраструктуры (например, Dev и Prod).

  • terraform workspace list: Показывает доступные пространства. По умолчанию всегда создается default.
  • terraform workspace new <имя>: Создает новое пространство и переключается на него.
  • terraform workspace select <имя>: Переключение между пространствами.
  • Логика в коде: С помощью переменной terraform.workspace и функции lookup можно менять параметры (например, тип инстанса) в зависимости от текущего пространства.
  • Хранение: При локальном хранении состояния файлы для разных пространств создаются в директории terraform.tfstate.d.

Работа с провайдерами (AWS и GCP)

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

AWS

  • Рекомендуемый способ: Экспорт переменных окружения (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION).
  • В коде блок provider "aws" может содержать параметр region.
  • Bootstrapping: Параметр user_data позволяет запускать скрипты при создании инстанса (например, для установки Nginx или Apache).

Google Cloud Platform (GCP)

  • Требуется создание Service Account, предоставление прав (например, Project Owner) и скачивание ключа в формате JSON.
  • В блоке provider "google" указываются credentials (путь к JSON), project, region и zone.

Отладка и логирование

Если Terraform ведет себя неожиданно, используйте переменные окружения для детального анализа:

  • TF_LOG: Устанавливает уровень детализации. Доступные уровни: INFO, WARNING, ERROR, DEBUG, TRACE (самый подробный).
  • TF_LOG_PATH: Позволяет записывать логи в файл для последующего анализа или отправки отчета об ошибке.
  • Чтобы отключить логирование, используйте команду unset для этих переменных.