Почему 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 | Средняя |
Ключевые выводы
- IaC делает тестовые окружения воспроизводимыми — определите один раз, создавайте многократно
- Версионируйте инфраструктуру — изменения отслеживаются и обратимы
- Terraform plan перед apply — всегда предварительно просматривайте изменения
- Используйте модули для переиспользуемых паттернов
- Уничтожайте после тестирования — эфемерная инфраструктура экономит деньги