TL;DR
- Kitchen-Terraform был архивирован в октябре 2024—не используйте его для новых проектов
- Если вы унаследовали кодовую базу с Kitchen-Terraform, это руководство поможет поддерживать её, планируя миграцию
- Паттерны compliance InSpec всё ещё ценны—мигрируйте их на нативные тесты Terraform или standalone InSpec
Подходит для: Команд, поддерживающих legacy-конфигурации Kitchen-Terraform или планирующих миграцию Пропустите если: Начинаете с нуля—используйте нативные тесты Terraform или Terratest Время чтения: 10 минут
Давайте сразу к делу: Kitchen-Terraform deprecated и архивирован. Репозиторий стал read-only 22 октября 2024 года, после выпуска нативного фреймворка тестирования Terraform 1.6.
Но реальность такова: тысячи организаций всё ещё запускают Kitchen-Terraform в production. Если вы унаследовали одну из таких кодовых баз, вам нужно понять, как она работает, поддерживать её в рабочем состоянии и планировать миграцию. Для этого и создано это руководство.
Понимание Архитектуры Kitchen-Terraform
Kitchen-Terraform объединял три инструмента:
| Компонент | Роль | Статус в 2026 |
|---|---|---|
| Test Kitchen | Фреймворк оркестрации тестов | Активен (экосистема Ruby) |
| Terraform | Provisioning инфраструктуры | Активен (используйте 1.6+ для нативных тестов) |
| InSpec | Верификация compliance | Активен (Chef InSpec) |
Рабочий процесс: Test Kitchen оркестрирует → Terraform провиженит → InSpec верифицирует.
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Test Kitchen │────▶│ Terraform │────▶│ InSpec │
│ (Оркестрировать)│ │ (Провиженить) │ │ (Верифицировать)│
└─────────────────┘ └─────────────────┘ └─────────────────┘
Пререквизиты для Поддержки Legacy
Если вы поддерживаете существующую конфигурацию Kitchen-Terraform:
- Ruby 2.7+ с Bundler
- Terraform < 2.0 (Kitchen-Terraform поддерживает >= 0.11.4, < 2.0.0)
- gem kitchen-terraform (версия 7.x была последним мажорным релизом)
- InSpec 4.x или 5.x
Проверьте текущие версии:
ruby --version
terraform version
bundle exec kitchen version
inspec version
Анатомия Проекта Kitchen-Terraform
Типичная структура:
terraform-module/
├── main.tf
├── variables.tf
├── outputs.tf
├── kitchen.yml # Конфигурация Test Kitchen
├── Gemfile # Ruby-зависимости
└── test/
└── integration/
└── default/
├── controls/
│ └── example.rb # Контролы InSpec
└── inspec.yml # Профиль InSpec
Файл kitchen.yml
driver:
name: terraform
root_module_directory: .
parallelism: 4
provisioner:
name: terraform
verifier:
name: terraform
systems:
- name: default
backend: aws
controls:
- example
platforms:
- name: terraform
suites:
- name: default
driver:
variables:
instance_type: t3.micro
environment: test
Пример Контрола InSpec
# test/integration/default/controls/example.rb
control 's3-bucket-encryption' do
impact 1.0
title 'S3 bucket must have encryption enabled'
desc 'Verify that the S3 bucket has server-side encryption configured'
describe aws_s3_bucket(bucket_name: input('output_bucket_name')) do
it { should exist }
it { should have_default_encryption_enabled }
end
end
control 's3-bucket-versioning' do
impact 0.7
title 'S3 bucket should have versioning enabled'
describe aws_s3_bucket(bucket_name: input('output_bucket_name')) do
it { should have_versioning_enabled }
end
end
Обратите внимание, как outputs Terraform (с префиксом output_) автоматически становятся inputs InSpec.
Запуск Legacy-Тестов
Рабочий процесс Kitchen-Terraform:
# Установить зависимости
bundle install
# Создать инфраструктуру и запустить тесты
bundle exec kitchen test
# Или пошагово:
bundle exec kitchen create # Инициализировать Terraform
bundle exec kitchen converge # Применить Terraform
bundle exec kitchen verify # Запустить тесты InSpec
bundle exec kitchen destroy # Очистить
Отладка Упавших Тестов
# Сохранить инфраструктуру после падения
bundle exec kitchen verify --destroy=never
# Запустить конкретную suite
bundle exec kitchen test default-terraform
# Подробный вывод
bundle exec kitchen test -l debug
Почему Миграция Необходима
Помимо статуса архивации, Kitchen-Terraform имеет практические ограничения:
| Проблема | Влияние |
|---|---|
| Нет новых features | Не сможете использовать Terraform 2.x когда выйдет |
| Только патчи безопасности | Уязвимости могут остаться без внимания |
| Зависимость от Ruby | Дополнительный runtime в CI/CD pipelines |
| Медленное выполнение | Test Kitchen добавляет overhead vs нативные тесты |
| Ограниченное сообщество | Уменьшающаяся поддержка и примеры |
Путь Миграции 1: Нативные Тесты Terraform
Для большинства команд мигрируйте на встроенный фреймворк тестирования Terraform (Terraform 1.6+).
До (Kitchen-Terraform InSpec)
# test/integration/default/controls/s3.rb
control 's3-encryption' do
describe aws_s3_bucket(bucket_name: input('output_bucket_name')) do
it { should have_default_encryption_enabled }
end
end
После (Нативный Тест Terraform)
# tests/s3_bucket.tftest.hcl
run "create_s3_bucket" {
command = apply
assert {
condition = aws_s3_bucket_server_side_encryption_configuration.this.rule[0].apply_server_side_encryption_by_default[0].sse_algorithm == "AES256"
error_message = "S3 bucket must have AES256 encryption enabled"
}
}
run "verify_versioning" {
command = apply
assert {
condition = aws_s3_bucket_versioning.this.versioning_configuration[0].status == "Enabled"
error_message = "S3 bucket versioning must be enabled"
}
}
Запуск:
terraform test
Паттерн Скрипта Миграции
#!/bin/bash
# migrate-kitchen-to-native.sh
# 1. Извлечь контролы InSpec
CONTROLS_DIR="test/integration/default/controls"
# 2. Создать директорию тестов Terraform
mkdir -p tests
# 3. Сгенерировать отчёт миграции
echo "Контролы для миграции:"
grep -r "^control" $CONTROLS_DIR | while read line; do
echo " - $line"
done
# 4. Напоминание
echo ""
echo "Требуются ручные шаги:"
echo "1. Конвертировать каждый контрол InSpec в блоки assert Terraform"
echo "2. Сопоставить input('output_*') с атрибутами ресурсов Terraform"
echo "3. Удалить зависимости kitchen.yml и Gemfile"
Путь Миграции 2: Standalone InSpec
Если ваши контролы InSpec сложные или тестируют больше, чем состояние Terraform, запускайте InSpec независимо:
# Установить InSpec
gem install inspec-bin
# Запустить против задеплоенной инфраструктуры
inspec exec test/integration/default \
--input output_bucket_name=my-bucket-name \
--target aws://us-west-2
Создайте wrapper-скрипт для CI/CD:
#!/bin/bash
# run-compliance-tests.sh
# Задеплоить с Terraform
terraform init
terraform apply -auto-approve
# Извлечь outputs для InSpec
BUCKET_NAME=$(terraform output -raw bucket_name)
# Запустить тесты compliance InSpec
inspec exec ./compliance \
--input output_bucket_name=$BUCKET_NAME \
--target aws://$AWS_REGION \
--reporter cli json:reports/compliance.json
# Очистить
terraform destroy -auto-approve
Миграция с Помощью ИИ
В 2026 году инструменты ИИ могут значительно ускорить вашу миграцию.
Что ИИ делает хорошо:
- Конвертация Ruby-синтаксиса InSpec в HCL assertions Terraform
- Определение эквивалентных атрибутов ресурсов Terraform для проверок InSpec
- Генерация чек-листов миграции из файлов kitchen.yml
- Написание wrapper-скриптов для standalone выполнения InSpec
Что всё ещё требует людей:
- Решение, какие контролы всё ещё актуальны
- Понимание требований compliance за каждым контролом
- Валидация, что мигрированные тесты сохраняют то же покрытие
- Обработка кастомных ресурсов InSpec без эквивалента в Terraform
Полезный промпт:
Конвертируй этот контрол InSpec в нативный тест Terraform:
control 'ec2-instance-type' do
impact 1.0
title 'EC2 instance must use approved instance type'
describe aws_ec2_instance(name: input('output_instance_id')) do
its('instance_type') { should be_in ['t3.micro', 't3.small'] }
its('image_id') { should match /^ami-/ }
end
end
Ресурс Terraform определён как:
resource "aws_instance" "main" {
ami = var.ami_id
instance_type = var.instance_type
}
Сгенерируй эквивалентный файл .tftest.hcl с правильными assertions.
Фреймворк Принятия Решений
Сохраните Kitchen-Terraform Если:
- У вас обширные кастомные ресурсы InSpec
- Timeline миграции 12+ месяцев
- Команда имеет сильную экспертизу в Ruby
- Фреймворки compliance специально требуют отчёты InSpec
Мигрируйте на Нативные Тесты Если:
- Вы тестируете конфигурацию Terraform, а не состояние облака
- Хотите более быстрое выполнение тестов
- Уменьшаете зависимости CI/CD
- Начинаете с нуля или рефакторите в любом случае
Мигрируйте на Standalone InSpec Если:
- Нужны отчёты compliance CIS benchmark
- Тестирование выходит за пределы ресурсов, управляемых Terraform
- Регуляторные требования предписывают InSpec
- Инфраструктура с несколькими инструментами (не только Terraform)
Измерение Успеха Миграции
| Метрика | До | После | Как Измерять |
|---|---|---|---|
| Время выполнения тестов | 5-10 мин | 1-3 мин | Длительность CI pipeline |
| Зависимости CI | Ruby + Terraform | Только Terraform | Конфигурация pipeline |
| Покрытие тестами | X контролов | X assertions | Подсчёт тест-кейсов |
| Нагрузка на поддержку | Высокая | Низкая | Время на обновления тестов |
Сигналы, что миграция не работает:
- Тесты проходят, но аудиты compliance падают — пробелы в покрытии
- Время выполнения увеличилось — переусложнённые assertions
- Больше ложных срабатываний — слишком строгие assertions
Распространённые Ошибки
1. Потеря Покрытия Compliance
# ПЛОХО: Проверяет только состояние Terraform
assert {
condition = aws_s3_bucket.this.bucket != ""
error_message = "Bucket must exist"
}
# ЛУЧШЕ: Проверяет реальную конфигурацию
assert {
condition = aws_s3_bucket_versioning.this.versioning_configuration[0].status == "Enabled"
error_message = "Versioning must be enabled for compliance"
}
2. Игнорирование Тестирования Состояния Облака InSpec
Нативные тесты Terraform проверяют состояние, не реальность. Для реальной верификации в облаке сохраните InSpec или используйте Terratest:
# InSpec тестирует реальные ресурсы AWS
inspec exec compliance/ --target aws://
# Тесты Terraform проверяют состояние Terraform
terraform test
3. Спешка с Миграцией
Мигрируйте инкрементально:
- Сначала: Запускайте ОБА Kitchen-Terraform И нативные тесты параллельно
- Затем: Проверьте паритет покрытия
- Наконец: Удалите Kitchen-Terraform
Что Дальше
Если вы поддерживаете Kitchen-Terraform, начните план миграции сейчас. Фреймворк не будет получать новые features, и совместимость с Terraform 2.x под вопросом.
Для новых проектов полностью пропустите Kitchen-Terraform. Используйте нативные тесты Terraform для валидации конфигурации и Terratest или standalone InSpec для верификации реальной инфраструктуры.
Паттерны InSpec, которые вы изучили, всё ещё ценны—мышление compliance-as-code напрямую переносится на любой фреймворк тестирования.
Связанные статьи:
- Стратегии Тестирования и Валидации Terraform
- Terratest: Тестирование Инфраструктуры как Код
- Лучшие Практики Тестирования Pulumi
- Стратегия Пирамиды Автоматизации Тестов
Внешние ресурсы: