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)
TerraformProvisioning инфраструктурыАктивен (используйте 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
Зависимости CIRuby + 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. Спешка с Миграцией

Мигрируйте инкрементально:

  1. Сначала: Запускайте ОБА Kitchen-Terraform И нативные тесты параллельно
  2. Затем: Проверьте паритет покрытия
  3. Наконец: Удалите Kitchen-Terraform

Что Дальше

Если вы поддерживаете Kitchen-Terraform, начните план миграции сейчас. Фреймворк не будет получать новые features, и совместимость с Terraform 2.x под вопросом.

Для новых проектов полностью пропустите Kitchen-Terraform. Используйте нативные тесты Terraform для валидации конфигурации и Terratest или standalone InSpec для верификации реальной инфраструктуры.

Паттерны InSpec, которые вы изучили, всё ещё ценны—мышление compliance-as-code напрямую переносится на любой фреймворк тестирования.


Связанные статьи:

Внешние ресурсы: