Почему IaC важен для QA

Infrastructure as Code (IaC) означает определение инфраструктуры — серверов, баз данных, сетей, балансировщиков — в конфигурационных файлах вместо ручного создания через веб-консоли или CLI-команды.

Для QA-инженеров IaC трансформирует управление тестовыми окружениями. Вместо просьбы к DevOps-инженеру «настроить staging-окружение» (что может занять дни), вы определяете окружение в коде и создаёте одной командой.

Принципы IaC

Декларативный vs. Императивный

Декларативный (что вы хотите): «Мне нужна база PostgreSQL, версия 15, с 4GB RAM.» Инструмент определяет, как это сделать. Terraform использует этот подход.

Императивный (как это сделать): «Установи PostgreSQL. Настрой память на 4GB. Создай пользователя.» Вы указываете каждый шаг. Ansible использует этот подход.

Ключевые принципы

ПринципОписаниеПольза для QA
Контроль версийКод инфраструктуры живёт в GitОтслеживание изменений, ревью
ИдемпотентностьДвойной запуск даёт одинаковый результатНадёжное создание окружений
ВоспроизводимостьОдин код создаёт идентичные окруженияКонсистентные тестовые окружения
СамодокументированиеКод и есть документацияНет устаревших wiki-страниц
РевьюируемостьИзменения проходят code reviewОбнаружение ошибок до влияния на окружения

Основы Terraform

Terraform — самый популярный инструмент IaC. Работает со всеми основными облачными провайдерами (AWS, GCP, Azure).

HCL (HashiCorp Configuration Language)

resource "aws_db_instance" "test_db" {
  identifier     = "qa-test-database"
  engine         = "postgres"
  engine_version = "15.4"
  instance_class = "db.t3.micro"
  db_name        = "testdb"
  username       = "test_user"
  password       = var.db_password
  allocated_storage = 20

  tags = {
    Environment = "qa"
    ManagedBy   = "terraform"
  }
}

Рабочий процесс Terraform

# Инициализация Terraform
terraform init

# Предварительный просмотр изменений
terraform plan

# Применение изменений
terraform apply

# Уничтожение инфраструктуры
terraform destroy

IaC для тестовых окружений

Паттерн: Переиспользуемый модуль

module "test_env" {
  source = "./modules/test-environment"
  environment_name = "pr-${var.pr_number}"
  app_version      = var.git_sha
  db_version       = "15"
}

Этот модуль инкапсулирует всё необходимое для тестового окружения.

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

Напишите конфигурацию Terraform для тестового окружения: PostgreSQL (v15), Redis, сервер приложения и outputs для строк подключения.

Решение
terraform {
  required_providers {
    aws = { source = "hashicorp/aws", version = "~> 5.0" }
  }
}

variable "environment" {
  type    = string
  default = "qa"
}

resource "aws_db_instance" "postgres" {
  identifier        = "${var.environment}-postgres"
  engine            = "postgres"
  engine_version    = "15.4"
  instance_class    = "db.t3.micro"
  db_name           = "testdb"
  username          = "testuser"
  password          = "testpass123"
  allocated_storage = 20
  skip_final_snapshot = true
  tags = { Environment = var.environment }
}

resource "aws_elasticache_cluster" "redis" {
  cluster_id      = "${var.environment}-redis"
  engine          = "redis"
  node_type       = "cache.t3.micro"
  num_cache_nodes = 1
  tags = { Environment = var.environment }
}

resource "aws_instance" "app" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t3.small"
  tags = { Name = "${var.environment}-app" }
}

output "database_url" {
  value     = "postgresql://testuser@${aws_db_instance.postgres.endpoint}/testdb"
  sensitive = true
}

output "app_url" {
  value = "http://${aws_instance.app.public_ip}:3000"
}

Сравнение инструментов IaC

ИнструментТипЛучше всего дляКривая обучения
TerraformДекларативное провизионированиеОблачная инфраструктураСредняя
AnsibleИмперативная конфигурацияНастройка серверовНизкая
PulumiДекларативный (реальные языки)Команды, предпочитающие TypeScript/PythonСредняя
CloudFormationДекларативный (только AWS)Исключительно AWS-окруженияСредняя
HelmДекларативный (только K8s)Деплой приложений KubernetesСредняя

Ключевые выводы

  1. IaC делает тестовые окружения воспроизводимыми — определите один раз, создавайте многократно
  2. Версионируйте инфраструктуру — изменения отслеживаются и обратимы
  3. Terraform plan перед apply — всегда предварительно просматривайте изменения
  4. Используйте модули для переиспользуемых паттернов
  5. Уничтожайте после тестирования — эфемерная инфраструктура экономит деньги