2.6 Terraform: Infrastructure as Code

2.6 Terraform: Infrastructure as Code #

🎯 Что такое Terraform простыми словами #

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

🏗️ Аналогия со строительством #

Аналогия со строительством:

Традиционный подход (ручное строительство): Поход в магазин → покупка материалов → доставка на стройку → ручное строительство

Terraform (автоматизированное строительство): Описываем дом в чертеже → нажимаем “печать” → получаем готовый дом

🚀 Зачем нужен Terraform? #

Проблемы без IaC #

Проблемы ручного создания инфраструктуры:

Поэтапные действия разработчика:

  1. Вход в веб-интерфейс AWS Console
  2. Создание VPC (часто забывают про группы безопасности)
  3. Создание EC2-инстанса (можно ошибиться с размером)
  4. Настройка RDS базы данных (можно забыть включить резервное копирование)
  5. Через месяц никто не помнит, что именно создавалось и как

С Terraform #

Подход с Terraform:

Один файл описывает всю желаемую инфраструктуру:

  • Определяем ресурс EC2-инстанса
  • Указываем образ AMI (ami-12345)
  • Выбираем тип инстанса (t3.micro)
  • Добавляем метки для идентификации

Одна команда “terraform apply” создает всю готовую инфраструктуру

🛠️ Установка Terraform #

🟢 Базовый уровень - Linux/Mac #

Пошаговая установка Terraform на Linux/Mac:

  1. Загрузка: Скачиваем архив Terraform версии 1.7.0 для Linux AMD64 с официального сайта HashiCorp

  2. Распаковка: Извлекаем исполняемый файл из ZIP-архива

  3. Установка: Перемещаем бинарный файл в системную папку /usr/local/bin/

  4. Проверка: Убеждаемся, что Terraform установлен корректно и доступен из командной строки

Windows #

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

Вариант 1: Использование менеджера пакетов Chocolatey для автоматической установки Terraform

Вариант 2: Ручная загрузка с официального сайта terraform.io/downloads

📁 Структура проекта Terraform #

🟢 Минималистичный проект #

my-infrastructure/
├── main.tf          # Основные ресурсы
├── variables.tf     # Переменные
├── outputs.tf       # Выходные значения
└── terraform.tfvars # Значения переменных

🟡 Продакшн структура #

terraform-project/
├── environments/
│   ├── dev/
│   │   ├── main.tf
│   │   └── terraform.tfvars
│   ├── staging/
│   └── prod/
├── modules/
│   ├── vpc/
│   ├── ec2/
│   └── rds/
└── shared/
    └── variables.tf

🎯 Основные команды Terraform #

🟢 Hello World пример #

Базовые команды Terraform для начинающих:

  1. Инициализация проекта: Скачиваем провайдеры и готовим рабочую директорию
  2. Проверка плана: Показываем, какие изменения будут внесены в инфраструктуру
  3. Применение: Выполняем запланированные изменения в облаке
  4. Удаление: Полностью удаляем созданную инфраструктуру

Детальное объяснение команд #

Подробное описание каждой команды Terraform:

terraform init: Инициализация проекта - загружает необходимые провайдеры AWS, Azure, GCP из реестра Результат: Проект готов к работе

terraform plan: Предварительный просмотр изменений - безопасно показывает, что будет создано, изменено или удалено Результат: Никаких изменений в реальной инфраструктуре, только план

terraform apply: Применение изменений - выполняет запланированные операции в реальной инфраструктуре Предупреждение: Изменяет настоящие ресурсы в облаке!

terraform destroy: Удаление всех ресурсов - полностью уничтожает созданную инфраструктуру Критическое предупреждение: Необратимо удаляет все созданные ресурсы!

🌟 Практический пример: Веб-сервер на AWS #

🟢 Простейший EC2 instance #

Конфигурация Terraform для создания веб-сервера в AWS:

Настройка провайдера:

  • Минимальная версия Terraform: 1.0
  • AWS провайдер версии 5.x из реестра HashiCorp
  • Регион размещения: Европа Запад (Ирландия)

Создание EC2-инстанса:

  • Базовый образ: Amazon Linux 2 (ami-0c02fb55956c7d316)
  • Тип инстанса: t3.micro (подходит для Free Tier)
  • Автоматическая настройка через user_data:
    • Обновление системных пакетов
    • Установка Apache HTTP Server
    • Запуск веб-сервера и добавление в автозагрузку
    • Создание тестовой HTML-страницы с приветствием

Метки ресурса:

  • Имя: “WebServer”
  • Окружение: “Development”
  • Управляется: “Terraform”

Вывод результата:

  • Отображение публичного IP-адреса созданного сервера

Запуск примера #

Пошаговое выполнение примера:

Инициализация: Подготавливаем проект - загружаем AWS провайдер и создаем рабочую среду

Просмотр плана: Terraform покажет “План: создать 1 ресурс, изменить 0, удалить 0”

Применение изменений:

  • Terraform запросит подтверждение
  • Введите “yes” для продолжения
  • Процесс создания займет 1-2 минуты

Ожидаемый результат: Получите публичный IP-адрес вида “3.248.123.45” для доступа к веб-серверу

🟡 Средний уровень: Переменные и модули #

Использование переменных #

Определение переменных в файле variables.tf:

Переменная типа инстанса:

  • Описание: тип виртуальной машины EC2
  • Тип данных: строка
  • Значение по умолчанию: t3.micro (для небольших проектов)

Переменная окружения:

  • Описание: среда развертывания (разработка, тестирование, продакшен)
  • Тип данных: строка
  • Обязательна для указания

Переменная разрешенных IP-адресов:

  • Описание: список IP-адресов для доступа к серверу
  • Тип данных: список строк
  • Значение по умолчанию: открыт для всех (0.0.0.0/0)

Использование переменных в основной конфигурации:

Настройка EC2-инстанса с переменными:

  • Образ AMI: фиксированный Amazon Linux 2
  • Тип инстанса: берется из переменной instance_type
  • Метки: динамически формируются с использованием переменной environment
    • Имя сервера: “WebServer-” + название окружения
    • Окружение: значение переменной environment

Настройка группы безопасности:

  • Префикс имени: “web-sg-” + название окружения
  • Входящий трафик HTTP:
    • Порт: 80 (стандартный HTTP)
    • Протокол: TCP
    • Разрешенные адреса: из переменной allowed_ips
  • Исходящий трафик:
    • Разрешен весь трафик во все стороны (типично для веб-серверов)

Пример файла terraform.tfvars с конкретными значениями:

Параметры для staging-окружения:

  • Тип инстанса: t3.small (больше ресурсов чем по умолчанию)
  • Окружение: staging (тестовая среда)
  • Разрешенные IP-сети:
    • 203.0.113.0/24 (тестовая подсеть документации RFC)
    • 198.51.100.0/24 (дополнительная тестовая подсеть)

🟠 Продвинутый уровень: State Management #

Remote State с S3 #

Настройка удаленного хранения Terraform state в AWS S3:

Конфигурация backend для команды:

  • S3-бакет: “my-terraform-state-bucket” (централизованное хранилище)
  • Путь к файлу: “infrastructure/terraform.tfstate” (организованная структура)
  • Регион AWS: eu-west-1 (Европа)

Механизмы защиты:

  • Блокировка файла состояния через DynamoDB таблицу “terraform-locks”
  • Шифрование state-файла для защиты конфиденциальной информации
  • Предотвращение одновременного редактирования несколькими разработчиками

State команды #

Команды для управления состоянием Terraform:

Просмотр всех ресурсов: Отображает список всех ресурсов, управляемых Terraform в текущем проекте

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

Импорт существующего ресурса: Добавляет уже созданный в AWS инстанс с ID “i-1234567890abcdef0” под управление Terraform

Удаление из управления: Убирает ресурс из Terraform state, при этом сам ресурс в AWS остается нетронутым (полезно при передаче управления)

🔴 Экспертный уровень: Модули и лучшие практики #

Создание переиспользуемого модуля #

Конфигурация модуля web-server для повторного использования:

Входные параметры модуля:

  • Окружение: обязательная строковая переменная (для маркировки)
  • Тип инстанса: строковая переменная с значением по умолчанию t3.micro

Конфигурация EC2-инстанса:

  • Образ AMI: автоматический поиск последней версии Amazon Linux 2
  • Группа безопасности: ссылка на соответствующую группу безопасности
  • Пользовательские данные: загрузка скрипта из шаблона userdata.sh с передачей параметра окружения

Автоматический поиск AMI:

  • Критерий: последняя версия образа
  • Владелец: официальные образы Amazon
  • Фильтр по имени: Amazon Linux 2 AMI с HVM виртуализацией для x86_64 архитектуры

Выходное значение:

  • Публичный IP-адрес созданного веб-сервера для использования в других частях конфигурации

Использование модуля #

Пример использования одного модуля для разных окружений:

Сервер для разработки:

  • Путь к модулю: локальная папка modules/web-server
  • Окружение: “development” (для маркировки и идентификации)
  • Тип ресурсов: t3.micro (минимальный для экономии)

Сервер для продакшена:

  • Путь к модулю: тот же модуль modules/web-server
  • Окружение: “production” (промышленная эксплуатация)
  • Тип ресурсов: t3.medium (мощнее для продакшена)

Вывод данных:

  • Публичный IP-адрес сервера разработки для быстрого доступа команды

🏗️ Реальный проект: Полная веб-архитектура #

Архитектура проекта #

Полноценная веб-архитектура в AWS:

Компоненты инфраструктуры:

  • Сетевая часть: VPC с публичными и приватными подсетями в нескольких зонах доступности
  • Балансировщик нагрузки: Application Load Balancer для распределения запросов
  • Вычислительные ресурсы: Auto Scaling Group с EC2-инстансами для автоматического масштабирования
  • База данных: Управляемая PostgreSQL через AWS RDS
  • Кэширование: Redis через ElastiCache для ускорения ответов
  • CDN: CloudFront для глобального распределения контента

main.tf - основная инфраструктура #

Конфигурация основной сетевой инфраструктуры AWS:

Настройка провайдера:

  • Минимальная версия Terraform: 1.0
  • AWS провайдер версии 5.x
  • Регион: получаем из переменной aws_region

Создание VPC (виртуальная частная сеть):

  • CIDR-блок: 10.0.0.0/16 (около 65000 IP-адресов)
  • Поддержка DNS: включено для разрешения имен серверов
  • Метка: динамическое имя на основе переменной project_name

Публичные подсети (для веб-серверов):

  • Количество: 2 подсети в разных зонах доступности
  • CIDR-блоки: 10.0.1.0/24 и 10.0.2.0/24 (по 256 адресов каждая)
  • Автоматическое назначение публичных IP-адресов включено

Приватные подсети (для баз данных):

  • Количество: 2 подсети в разных зонах доступности
  • CIDR-блоки: 10.0.10.0/24 и 10.0.11.0/24 (защищенные от интернета)
  • Публичные IP не назначаются

Интернет-шлюз:

  • Привязка к созданной VPC
  • Обеспечивает доступ в интернет для публичных подсетей

Таблица маршрутизации:

  • Привязка к основной VPC
  • Маршрут по умолчанию: весь трафик (0.0.0.0/0) направляется через Internet Gateway

Ассоциация маршрутов:

  • Связываем каждую публичную подсеть с таблицей маршрутизации
  • Количество ассоциаций: равно количеству публичных подсетей

Security Groups #

Конфигурация групп безопасности для многоуровневой архитектуры:

Группа безопасности для ALB (балансировщик):

  • Префикс имени: название проекта + “-alb-”
  • Привязка к созданной VPC

Входящие правила для балансировщика:

  • HTTP-трафик: порт 80, протокол TCP, доступ открыт для всех IP
  • HTTPS-трафик: порт 443, протокол TCP, доступ открыт для всех IP

Исходящие правила: Полный доступ ко всем портам и протоколам (стандартно для балансировщиков)

Группа безопасности для EC2-серверов:

  • Префикс имени: название проекта + “-ec2-”

Входящие правила для серверов:

  • HTTP от балансировщика: порт 80, доступ только для ALB security group
  • SSH доступ: порт 22, доступ ограничен CIDR-блоком из переменной ssh_cidr

Исходящие правила: Полный доступ ко всем портам и протоколам (для обновлений и внешних API)

RDS Database #

Конфигурация управляемой базы данных PostgreSQL:

Группа подсетей для базы данных:

  • Имя: динамическое на основе названия проекта + “-db-subnet-group”
  • Подсети: все созданные приватные подсети (безопасность через изоляцию)
  • Метки: идентификация по названию проекта

Группа безопасности для RDS:

  • Префикс имени: название проекта + “-rds-”
  • Привязка к основной VPC
  • Входящие правила: PostgreSQL (порт 5432), доступ только для EC2 security group

Конфигурация RDS-инстанса:

  • Идентификатор: название проекта + “-db”
  • Движок: PostgreSQL версии 15.4
  • Класс инстанса: из переменной db_instance_class
  • Хранилище: 20 GB начально, автомасштабирование до 100 GB
  • Шифрование: включено для защиты данных

Параметры резервного копирования:

  • Период хранения: 7 дней
  • Окно резервного копирования: 03:00-04:00 (ночью, минимальная нагрузка)
  • Окно обслуживания: воскресенье 04:00-05:00

Особенности:

  • Пропуск финального снимка: только для среды разработки (для быстрого удаления)

Variables #

Определение всех переменных для полноценного проекта:

Общие параметры проекта:

  • Название проекта: строковая переменная с значением по умолчанию “webapp”
  • Окружение: обязательное указание среды (разработка, тестирование, продакшен)
  • AWS регион: строковая переменная с значением по умолчанию “eu-west-1”

Параметры вычислительных ресурсов:

  • Тип EC2-инстанса: строковая переменная с значением по умолчанию “t3.micro”
  • Класс RDS-инстанса: строковая переменная с значением по умолчанию “db.t3.micro”

Параметры базы данных:

  • Имя базы: строковая переменная с значением по умолчанию “webapp”
  • Имя пользователя: строковая переменная с значением по умолчанию “dbadmin”
  • Пароль: обязательная конфиденциальная переменная (не отображается в логах)

Параметры безопасности:

  • SSH CIDR: строковая переменная для ограничения SSH-доступа, по умолчанию открыт для всех “0.0.0.0/0”

🔒 Безопасность и лучшие практики #

Secrets Management #

Правильное управление конфиденциальной информацией:

Неправильный подход (НИКОГДА не делайте так):

  • Определение пароля непосредственно в коде как значение по умолчанию
  • Опасность: пароль попадает в систему контроля версий!

Правильный подход:

  • Определение переменной без значения по умолчанию
  • Маркировка как sensitive: скрывает значение в логах и выводе

Использование AWS Secrets Manager:

  • Создание секрета: имя на основе названия проекта + “-db-password”
  • Сохранение значения: пароль сохраняется в зашифрованном виде в AWS
  • Преимущество: автоматическая ротация паролей

Remote State Security #

Продакшен-конфигурация удаленного state с максимальной безопасностью:

Основные настройки:

  • S3-бакет: “terraform-state-prod-bucket” (отдельный бакет для продакшена)
  • Ключ файла: “infrastructure/terraform.tfstate” (организованная структура)
  • Регион: Европа Запад (Ирландия)

Механизмы защиты:

  • Шифрование state-файла: включено с AWS KMS ключом
  • KMS-ключ: ARN ключа шифрования для дополнительной защиты
  • Блокировка: DynamoDB таблица “terraform-locks” предотвращает одновременное редактирование
  • Версионирование: автоматическое сохранение всех версий state-файла

Tagging Strategy #

Стратегия маркировки ресурсов для единообразия и аудита:

Определение общих меток:

  • Проект: название из переменной project_name
  • Окружение: название из переменной environment
  • Способ управления: “Terraform” (для отличия от ручно созданных ресурсов)
  • Ответственная команда: “DevOps Team”
  • Центр затрат: “Engineering” (для учета расходов)
  • Дата создания: автоматическое форматирование текущей даты

Пример использования в ресурсах:

  • Объединение общих меток с специфичными для конкретного ресурса
  • Имя сервера: название проекта + “-web-server”
  • Роль: “WebServer” (для идентификации назначения)

🔍 Отладка и мониторинг #

Debugging команды #

Команды для отладки и диагностики Terraform:

Подробное логирование:

  • Установка переменной окружения TF_LOG=DEBUG для максимальной детализации
  • Запуск применения с полным логированием всех операций

Логирование в файл:

  • Установка уровня INFO для сбалансированного логирования
  • Направление логов в файл terraform.log для последующего анализа

Проверка качества кода:

  • Проверка форматирования: автоматическое форматирование всех .tf файлов в проекте
  • Валидация конфигурации: проверка синтаксиса и логической структуры

Визуализация зависимостей:

  • Генерация графа зависимостей между ресурсами
  • Преобразование в PNG-изображение с помощью утилиты Graphviz
  • Полезно для понимания сложных архитектур

Мониторинг изменений #

Настройка правил жизненного цикла для критичных ресурсов:

Правила lifecycle для критичного сервера:

  • Защита от удаления: prevent_destroy = true предотвращает случайное уничтожение ресурса
  • Игнорирование обновлений: ignore_changes = [ami] позволяет автоматические обновления AMI без пересоздания
  • Безопасное обновление: create_before_destroy = true создает новый ресурс перед удалением старого (минимизирует downtime)

📊 Multi-Cloud и Workspaces #

Workspaces для разных окружений #

Команды для управления workspace (рабочими пространствами):

Создание отдельных workspace для каждого окружения:

  • Разработка: создание workspace с именем “development” для экспериментов
  • Тестирование: создание workspace “staging” для предпродакшенных тестов
  • Продакшен: создание workspace “production” для боевой среды

Операции с workspace:

  • Переключение: выбор рабочего пространства “production” для дальнейших операций
  • Проверка текущего: отображение имени активного workspace
  • Просмотр всех: полный список всех доступных workspace

Conditional Resources по workspace #

Конфигурация ресурсов в зависимости от окружения:

Адаптивная конфигурация EC2:

  • Образ AMI: фиксированный для всех окружений
  • Тип инстанса: условный выбор - t3.large для продакшена, t3.micro для остальных сред
  • Метки: автоматическое добавление имени workspace в название сервера

Условное создание мониторинга:

  • Количество алармов: 1 для продакшена, 0 для остальных сред
  • Название аларма: автоматическое добавление имени workspace
  • Компаратор: проверка превышения порогового значения
  • Остальные параметры: настраиваются соответствующим образом

🚀 CI/CD Integration #

GitHub Actions для Terraform #

Конфигурация CI/CD пайплайна для автоматического развертывания инфраструктуры:

Настройка триггеров:

  • Название workflow: ‘Terraform’
  • Запуск при push в главную ветку main
  • Запуск при создании pull request’ов

Настройка рабочей среды:

  • Операционная система: Ubuntu последняя версия
  • Оболочка по умолчанию: bash
  • Рабочая директория: ./terraform для всех команд

Последовательность шагов:

  1. Checkout: Загрузка исходного кода из репозитория
  2. Setup Terraform: Установка Terraform версии 1.7.0
  3. Проверка форматирования: проверка соответствия стандартам кода
  4. Инициализация: загрузка провайдеров с AWS креденшелами
  5. Валидация: проверка синтаксиса и логики
  6. Планирование: генерация плана изменений без цветового вывода
  7. Применение: автоматическое применение только при push в main ветку

Механизм безопасности:

  • AWS креденшелы хранятся в GitHub Secrets и передаются через переменные окружения

GitLab CI для Terraform #

Конфигурация GitLab CI/CD пайплайна для Terraform:

Основные настройки:

  • Базовый образ: официальный Terraform образ от GitLab
  • Корневая директория: папка terraform в проекте
  • Адрес state: использование встроенного GitLab Terraform backend

Кэширование:

  • Ключ кэша: “terraform” для общего использования
  • Кэшируемые папки: .terraform директория с провайдерами и модулями

Предварительные действия перед каждой работой:

  • Переход в рабочую директорию terraform
  • Проверка версии Terraform
  • Инициализация проекта

Этапы пайплайна:

  1. Валидация: проверка корректности конфигураций
  2. Планирование: генерация плана и сохранение в артифакты
  3. Применение: использование сохраненного плана, только для главной ветки

⚡ Performance и Optimization #

Parallel Execution #

Оптимизация производительности для больших инфраструктур:

Увеличение параллелизма:

  • Параметр -parallelism=20 позволяет одновременно создавать до 20 ресурсов
  • По умолчанию Terraform работает с 10 параллельными операциями

Оптимизация для больших инфраструктур:

  • Планирование без обновления: параметр -refresh=false пропускает синхронизацию с реальными ресурсами (быстрее, но менее точно)
  • Применение без обновления: аналогичный параметр для быстрого применения

Механизм кэширования:

  • Ключ кэша: “terraform” для сохранения между запусками
  • Кэшируемая папка: .terraform с загруженными провайдерами

Этапы работы пайплайна:

  1. Валидация: проверка корректности конфигураций
  2. Планирование: генерация плана и сохранение в файл “planfile”
  3. Применение: использование сохраненного плана, только для главной ветки

Resource Targeting #

Целевое управление конкретными ресурсами:

Целевое применение изменений:

  • Отдельный ресурс: применение изменений только к конкретному EC2-инстансу web_server
  • Целый модуль: применение изменений ко всем ресурсам модуля database
  • Полезно для постепенного обновления части инфраструктуры

Целевое удаление:

  • Уничтожение только тестового сервера test_server
  • Остальная инфраструктура остается нетронутой
  • Критично важно для безопасного обслуживания

🎯 Реальные кейсы использования #

Кейс 1: Migration с CloudFormation #

Пошаговая миграция с AWS CloudFormation на Terraform:

Импорт существующих ресурсов:

  • EC2-инстанс: добавление существующего сервера с ID “i-1234567890abcdef0” под управление Terraform
  • Группа безопасности: импорт существующей группы с ID “sg-12345678”
  • Преимущество: никаких прерываний в работе систем

Генерация конфигурации:

  • Экспорт текущего state в JSON-формате
  • Использование jq для фильтрации и выбора ресурсов
  • Получение детальной информации о всех управляемых ресурсах

Кейс 2: Multi-Region Deployment #

Мультирегиональное развертывание для глобальной доступности:

Настройка мультипле провайдеров:

  • Провайдер для США: псевдоним “us_east”, регион us-east-1 (Восточное побережье США)
  • Провайдер для Европы: псевдоним “eu_west”, регион eu-west-1 (Ирландия)
  • Позволяет работать с несколькими регионами одновременно

Создание ресурсов в разных регионах:

  • Сервер в США: EC2-инстанс с явным указанием провайдера aws.us_east
  • Сервер в Европе: EC2-инстанс с явным указанием провайдера aws.eu_west
  • Полезно для глобальных приложений с низкой задержкой

Кейс 3: Disaster Recovery #

Конфигурация аварийного восстановления (Disaster Recovery):

Основной регион (продакшен):

  • Модуль: ссылка на локальный модуль “./modules/infrastructure”
  • Регион: eu-west-1 (Ирландия) - основное место размещения
  • Окружение: “production” (полная конфигурация)
  • Признак: is_primary = true (основной регион)

Регион аварийного восстановления:

  • Модуль: тот же модуль с инфраструктурой
  • Регион: us-east-1 (Вирджиния) - альтернативное размещение
  • Окружение: “dr” (специальная маркировка)
  • Признак: is_primary = false (вторичный регион)

Оптимизация для DR:

  • Количество инстансов: 1 (минимально для экономии)
  • Хранение бэкапов: 30 дней (длительное хранение для надежности)

📈 Мониторинг и алерты #

CloudWatch интеграция #

Настройка мониторинга и алармов для Terraform-созданных ресурсов:

Конфигурация аларма на высокую нагрузку CPU:

  • Название: динамическое на основе названия проекта + “-high-cpu”
  • Компаратор: “GreaterThanThreshold” (превышение порогового значения)
  • Периоды оценки: 2 (два последовательных превышения)
  • Метрика: CPUUtilization из пространства имен AWS/EC2
  • Период: 120 секунд (2 минуты)
  • Статистика: среднее значение
  • Порог: 80% CPU

Привязка к ресурсам:

  • Мониторинг конкретного EC2-инстанса по ID
  • Действия при срабатывании: отправка уведомления через SNS-топик

Настройка уведомлений:

  • Создание SNS-топика с динамическим именем на основе названия проекта

🏆 Лучшие практики Terraform #

1. Структура кода #

Лучшие практики организации Terraform-кода:

✅ Рекомендуемые подходы:

  • Использование модулей для повторного использования кода
  • Один ресурс = один файл для крупных проектов
  • Логическая группировка связанных ресурсов в отдельные файлы
  • Последовательные соглашения по именованию

❌ Нежелательные подходы:

  • Один огромный main.tf файл со всеми ресурсами
  • Прямое указание конкретных значений в коде вместо переменных
  • Игнорирование автоматического форматирования terraform fmt

2. State Management #

Правильное управление состоянием для надежности:

✅ Обязательные практики:

  • Удаленное хранение state в продакшен-окружении (не локально)
  • Блокировка state-файла через DynamoDB для предотвращения конфликтов
  • Регулярное резервное копирование state-файлов
  • Отдельные state-файлы для каждого окружения (изоляция рисков)

❌ Опасные практики:

  • Локальное хранение state при работе в команде (конфликты гарантированы)
  • Коммит .tfstate файлов в Git-репозиторий (конфиденциальные данные)
  • Общий state-файл для разработки и продакшена (риск повреждения продакшена)

3. Security #

Принципы безопасности в Terraform:

✅ Обязательные меры безопасности:

  • Маркировка конфиденциальных переменных как sensitive (скрывает в логах)
  • Принцип минимальных прав для IAM-ролей и пользователей
  • Шифрование state-файлов при хранении в S3
  • Хранение паролей и API-ключей в AWS Secrets Manager

❌ Критически опасные практики:

  • Прямое указание паролей в Terraform-конфигурации
  • Излишне широкие IAM-права (например, полный доступ к AWS)
  • Незашифрованное хранение state-файлов
  • Использование root ключей доступа AWS

🎯 Практические задания #

🟢 Задание 1: Hello World #

Создайте простой EC2 instance с веб-сервером:

  1. Инициализируйте новый Terraform проект
  2. Создайте EC2 instance с Apache
  3. Выведите публичный IP
  4. Проверьте доступность веб-страницы

🟡 Задание 2: Multi-tier Architecture #

Создайте архитектуру с:

  1. VPC с публичными и приватными подсетями
  2. ALB для балансировки нагрузки
  3. Auto Scaling Group
  4. RDS базой данных

🟠 Задание 3: Модули #

  1. Создайте переиспользуемый модуль для веб-сервера
  2. Используйте модуль в разных окружениях
  3. Добавьте переменные и outputs
  4. Опубликуйте модуль в Terraform Registry

🔴 Задание 4: Production Setup #

  1. Настройте remote state с S3 и DynamoDB
  2. Создайте CI/CD pipeline
  3. Добавьте мониторинг и алерты
  4. Реализуйте blue-green deployment

🔗 Полезные ресурсы #

Документация #

Инструменты #

  • Terragrunt - DRY конфигурации
  • Terraform-docs - автогенерация документации
  • TFLint - линтер для Terraform

Обучение #

🎯 Заключение #

Terraform — это фундаментальный навык DevOps инженера в 2025 году. Основные принципы:

Infrastructure as Code — вся инфраструктура описана в коде
Immutable Infrastructure — изменяем через пересоздание
Version Control — история изменений инфраструктуры
Team Collaboration — общий стандарт для команды
Disaster Recovery — быстрое восстановление из кода

Помните: Terraform не просто инструмент, это новый подход к управлению инфраструктурой. Начните с простых примеров, изучите best practices, и постепенно переходите к сложным сценариям.


Следующий раздел: 2.8 Мониторинг и Observability