🏗️ Testing & Code Quality
terraform test, validation, checkov, tfsec, pre-commit hooks
✅ Built-in Variable Validation
В переменной блок `validation`: `condition` и `error_message`. Проверяется во время plan — до apply не доходит. Например, регион должен принимать только определённые значения или проверка формата типа инстанса.
🧪 terraform test (Terraform 1.6+)
Файлы `.tftest.hcl`. Блок `run` — запускает plan или apply. `assert` — проверяет условия. `expect_failures` — тестирует сценарии с ожидаемыми ошибками. Создаёт реальную инфраструктуру → тест → удаляет (нужен sandbox account).
🔍 Static Analysis: checkov & tfsec
checkov — Python, более 1000 проверок политик безопасности (CIS Benchmark). `checkov -d .` или `checkov -f main.tf`. tfsec — Go, быстрый, формат SARIF, нативная поддержка в GitHub Actions. Trivy — all-in-one (IaC + container + SBOM). Добавляйте вместе в CI/CD pipeline.
🎣 Pre-commit Hooks
Фреймворк pre-commit: `.pre-commit-config.yaml`. Хуки: `terraform fmt --check`, `terraform validate`, `terraform-docs` (автогенерация README), `checkov`, `tfsec`. Автоматически проверяет перед git commit. `pre-commit install` — однократная настройка.
💡 Ключевые моменты
- Variable validation: ошибка на этапе plan, до apply не доходит
- terraform test: .tftest.hcl, тестирование реальной инфраструктуры
- checkov: 1000+ политик, Python, CIS Benchmark
- tfsec: быстрый, Go, оптимален для CI/CD
- pre-commit: автоматическая проверка перед commit
📋 Пример кода
# Variable validation
variable "environment" {
type = string
validation {
condition = contains(["dev", "staging", "prod"], var.environment)
error_message = "Environment faqat dev, staging yoki prod bo'lishi mumkin."
}
}
variable "aws_region" {
type = string
validation {
condition = can(regex("^[a-z]{2}-[a-z]+-[0-9]$", var.aws_region))
error_message = "Region format noto'g'ri (masalan: us-east-1)."
}
}
# terraform test (tests/main.tftest.hcl)
run "test_s3_bucket_created" {
command = apply
assert {
condition = aws_s3_bucket.main.bucket_prefix == "my-app-"
error_message = "S3 bucket prefix noto'g'ri"
}
}
# pre-commit config (.pre-commit-config.yaml)
# repos:
# - repo: https://github.com/antonbabenko/pre-commit-terraform
# hooks:
# - id: terraform_fmt
# - id: terraform_validate
# - id: terraform_tfsec
🎯 Советы для экзамена
- Variable validation — проверяется не в runtime, а во время plan
- terraform test — встроен начиная с Terraform 1.6+ (раньше использовался terratest)
- checkov vs tfsec: у checkov больше политик, tfsec быстрее. Можно использовать оба вместе
- terraform fmt vs terraform validate: fmt = форматирование, validate = проверка синтаксиса/логики
- pre-commit hooks работают на ноутбуке разработчика, в CI/CD также нужен отдельный шаг
⚠️ Частые ошибки
- Думать, что terraform validate делает вызовы cloud API — validate проверяет только локальный синтаксис, а plan уже обращается к API
- Считать terraform test юнит-тестом — он создаёт реальную инфраструктуру, нужен sandbox
- Считать checkov PASSED гарантией безопасности — проверяются только заданные политики
🧠 Для запоминания: "VTP" = Validate (синтаксис), Test (функциональность), Policy (безопасность) — 3 уровня тестирования Terraform
Проверьте себя по теме «Testing & Code Quality»
Бесплатные интерактивные тесты, пробный экзамен и полные уроки — на платформе CertMaster.
Начать бесплатно →