Оглавление
- Введение
- Основные команды и рабочий процесс
- Управление состоянием (State)
- Продвинутое управление ресурсами
- Модули и масштабирование
- Рабочие пространства (Workspaces)
- Работа с провайдерами (AWS и GCP)
- Отладка и логирование
Введение
Terraform — это инструмент для создания, изменения и улучшения инфраструктуры как кода (IaC).
Эта заметка структурирует концепции мутабельной и иммутабельной инфраструктуры на основе принципов HashiCorp.
Основные команды и рабочий процесс
Фундаментальный цикл работы с Terraform включает несколько ключевых этапов:
terraform init: Инициализация рабочего каталога. Команда скачивает необходимые плагины провайдеров и модули.terraform validate: Проверка конфигурационных файлов на наличие синтаксических ошибок. Если ошибка есть, команда укажет строку и даст подсказку по исправлению.terraform fmt: Сканирует файлы и форматирует код в канонический формат для улучшения читаемости.terraform plan: Генерирует план выполнения, показывая, какие ресурсы будут созданы, изменены или удалены, не внося реальных изменений.terraform apply: Применяет изменения в инфраструктуре. Перед выполнением требует подтверждения (yes).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для этих переменных.