Вопросы на собеседовании по Terraform крутятся вокруг состояния (state), потому что большинство реальных проблем связано именно с ним: кто им владеет, кто может менять его одновременно и что происходит, когда реальность расходится с ним. Дальше идут модули, окружения, безопасные изменения и то, как вы будете вести Terraform в команде.
Ниже — 25 вопросов с ответами. В 2023 году HashiCorp изменила лицензию Terraform, и появился форк сообщества OpenTofu, так что упомяните, какой из них использует команда, если речь зайдёт об этом. Основные идеи и команды у обоих одинаковые.
Основы
1. Что такое Terraform и что такое инфраструктура как код?
Terraform — это инструмент для описания инфраструктуры в конфигурационных файлах и её применения через API провайдеров. Инфраструктура как код означает, что конфигурация записана, версионируется, проходит ревью и воспроизводима, а не собирается кликами в консоли.
2. В чём разница между декларативным и императивным подходом?
Terraform декларативен: вы описываете желаемое конечное состояние, а Terraform сам определяет шаги. В императивном скрипте вы пишете шаги сами, и повторный запуск может всё сломать.
3. Какие основные команды есть в Terraform?
| Команда | Что делает |
|---|---|
| terraform init | Скачивает провайдеры и модули, настраивает backend |
| terraform validate | Проверяет корректность конфигурации |
| terraform fmt | Форматирует файлы |
| terraform plan | Показывает, что изменится |
| terraform apply | Вносит изменения |
| terraform destroy | Удаляет управляемые ресурсы |
| terraform import | Берёт существующий ресурс под управление |
| terraform state | Просматривает и редактирует состояние |
4. Что такое провайдеры, ресурсы и источники данных?
Провайдер — это плагин, который общается с API, например AWS, Azure или Kubernetes. Ресурс — это то, что Terraform создаёт и которым управляет. Источник данных читает информацию о том, что уже существует, например о существующем VPC или последнем AMI.
5. Что такое переменные, выходные значения и локальные значения?
Входные переменные параметризуют конфигурацию. Выходные значения предоставляют данные для использования в командной строке или другими модулями. Локальные значения — это именованные выражения внутри модуля, которые помогают избежать повторений.
Состояние
6. Что такое файл состояния Terraform и почему он важен?
Состояние связывает вашу конфигурацию с реальными ресурсами и хранит их атрибуты. Terraform сравнивает конфигурацию, состояние и реальный мир, чтобы спланировать изменения. Потеряете состояние — и Terraform может попытаться пересоздать то, что уже существует. Оно также может содержать секреты, поэтому относитесь к нему как к конфиденциальным данным.
7. Где следует хранить состояние?
В удалённом backend, а не на ноутбуке одного человека, например в S3 с таблицей DynamoDB или с новым нативным блокированием S3, в Azure Storage, Google Cloud Storage или Terraform Cloud. Включите версионирование бакета, шифрование и ограничьте доступ.
8. Что такое блокировка состояния?
Она не даёт двум людям или пайплайнам применять изменения одновременно и повредить состояние. Большинство удалённых backend поддерживают её. Если запуск упал, возможно, придётся снять устаревшую блокировку командой terraform force-unlock, убедившись, что никто больше не применяет изменения.
9. Что такое дрейф и как с ним работать?
Дрейф — это когда реальная инфраструктура отличается от состояния, обычно потому что кто-то изменил её вручную. terraform plan (или plan -refresh-only) покажет это. Решите, откатить ли изменение через apply или обновить код, чтобы он соответствовал реальности.
10. Как перевести существующий ресурс под управление Terraform?
Напишите блок ресурса, затем выполните terraform import <address> <id> или используйте блок import в новых версиях. После этого запустите plan и правьте код, пока он не покажет отсутствие изменений.
11. Как разделить состояние между окружениями или командами?
Используйте отдельное состояние для каждого окружения и компонента, например одно для сети, по одному на каждое приложение и по одному на каждое окружение. Это ограничивает зону поражения и ускоряет планирование. Обменивайтесь значениями через выходные данные и источники данных или через удалённое состояние.
Модули и структура
12. Что такое модуль и когда его стоит писать?
Модуль — это переиспользуемая группа ресурсов с входными и выходными параметрами. Пишите его, когда один и тот же шаблон повторяется, например VPC или сервис, и вы хотите иметь единственную проверенную версию. Держите модули небольшими и сфокусированными, с разумными значениями по умолчанию, и версионируйте их.
13. Как вы управляете окружениями dev, staging и production?
Обычные варианты — отдельные директории или репозитории со своим state и файлами переменных, либо workspaces. Многие команды предпочитают отдельный state для каждого окружения, поскольку workspaces используют один и тот же код и легко применить изменения не туда. Используйте одни и те же модули с разными значениями переменных.
14. Что такое workspaces?
Именованные состояния внутри одного backend и конфигурации. Они полезны для временных копий одной и той же конфигурации, например тестовых окружений на каждую ветку, но это не надёжное разделение для production.
15. В чём разница между count и for_each?
count создаёт несколько копий, индексированных по позиции. for_each создаёт по одной копии на каждый элемент map или set, с ключом по имени. Предпочитайте for_each, потому что удаление элемента из середины списка count сдвигает индексы и может уничтожить и пересоздать ресурсы.
16. Что делает depends_on?
Он добавляет явную зависимость, когда Terraform не видит её по ссылкам. Используйте его умеренно, поскольку большинство зависимостей возникает из обращения к атрибутам другого ресурса.
Безопасные изменения и операции
17. Что такое lifecycle-правила?
create_before_destroy сначала создаёт замену, prevent_destroy блокирует удаление, ignore_changes пропускает атрибуты, изменённые вне Terraform, а replace_triggered_by принудительно запускает замену при изменении другого ресурса.
18. Как обращаться с секретами в Terraform?
Не прописывайте их в коде. Используйте менеджер секретов или переменные окружения, помечайте переменные и выходные значения как sensitive и помните, что значения всё равно могут попасть в state, поэтому защищайте state. Избегайте передачи секретов через обычные файлы переменных в системе контроля версий.
19. Как безопасно проверять и применять изменения?
Запускайте plan в pull request, просматривайте вывод плана, требуйте одобрения и применяйте из пайплайна с использованием сохранённого плана, чтобы выполнялось именно то, что было проверено. Следите за строками destroy или replace в плане.
20. План показывает, что база данных будет уничтожена и пересоздана. Что вы делаете?
Остановитесь и выясните причину. Частые причины — изменённый неизменяемый атрибут, переименованный ресурс или перемещённый модуль. Используйте блоки moved или terraform state mv, чтобы исправить изменения адреса, применяйте ignore_changes или prevent_destroy, если это уместно, и сделайте резервную копию перед любым рискованным применением.
21. Как переименовать или переместить ресурс, не уничтожая его?
Используйте блок moved в коде или terraform state mv, чтобы изменить его адрес в state. Затем запустите plan и убедитесь, что уничтожения нет.
22. Как фиксировать версии?
Используйте required_version для Terraform и required_providers с ограничениями версий, а также коммитьте файл .terraform.lock.hcl, чтобы все использовали одни и те же сборки провайдеров. Обновляйтесь осознанно и читайте changelog.
Практические вопросы и сценарии
23. Что такое provisioners и стоит ли их использовать?
Provisioners запускают скрипты на ресурсе после создания. Это крайняя мера, потому что они не отслеживаются в state и ошибки трудно обрабатывать. Предпочитайте cloud-init, образы, собранные инструментом вроде Packer, или управление конфигурацией.
24. Как бы вы организовали Terraform для команды с несколькими окружениями?
«Репозиторий для общих модулей с версионированными релизами и live-репозиторий с директорией на каждое окружение и компонент. У каждого свой удалённый state с блокировкой. Пайплайн запускает fmt, validate и plan на pull request, требует одобрения и применяет при merge. Доступ через краткосрочные учётные данные, а проверки политик отлавливают рискованные изменения».
25. Кто-то изменил ресурс в консоли, и теперь Terraform хочет откатить это. Что вы делаете?
Выясните, почему он это изменил. Если это было срочное исправление, обновите код, чтобы он соответствовал, и примените, чтобы изменение сохранилось. Если это была ошибка, примените, чтобы откатить его. Затем добавьте меры контроля, например ограничьте доступ на запись в консоли, чтобы это не повторилось.
Как готовиться
Создайте небольшой проект с удалённым backend, модулем и двумя окружениями. Отработайте переименование с блоком moved, импорт и устранение drift. Будьте готовы рассказать о случае, когда план вас удивил, и о том, что вы сделали. По смежным облачным темам смотрите наш гайд по вопросам для собеседования по AWS и гайд по Kubernetes.
Проговаривайте ответы вслух, особенно вопросы про state, где объяснения легко запутываются. Транскрипт mock-интервью показывает, где вы запнулись. Соблюдайте правила работодателя об использовании AI-инструментов на любом живом собеседовании.
Практикуйте ответы для собеседования по Terraform с YesToTheOffer
Проведите mock-техническое собеседование, объясните состояние и модули вслух и просмотрите свою расшифровку afterward. 30 бесплатных минут, без подписки.



