Разработка AI-системы генерации Infrastructure as Code
AI-генерация IaC — автоматическое создание Terraform, Ansible, Kubernetes manifests на основе текстового описания инфраструктуры. Снижает порог входа в IaC и ускоряет создание типовых конфигураций.
Генерация Terraform
def generate_terraform(description: str, cloud: str = "aws") -> str:
prompt = f"""Сгенерируй Terraform конфигурацию для {cloud}.
Описание: {description}
Требования:
- Используй последние stable provider версии
- variables.tf для всех параметров
- outputs.tf для ключевых ресурсов
- Теги для всех ресурсов
- Комментарии к нетривиальным блокам
- Backend S3 + DynamoDB для state locking"""
terraform_code = llm.generate(prompt, max_tokens=3000)
return terraform_code
# Пример: "Создай ECS кластер с ALB, 2-4 инстанции Fargate, RDS PostgreSQL"
# Результат: полный Terraform модуль с VPC, ECS, ALB, RDS, security groups, IAM
Валидация сгенерированного IaC
import subprocess
def validate_terraform(tf_dir: str) -> ValidationResult:
# terraform fmt
fmt_result = subprocess.run(["terraform", "fmt", "-check", tf_dir],
capture_output=True, text=True)
# terraform validate
init_result = subprocess.run(["terraform", "init", "-backend=false", tf_dir],
capture_output=True, text=True)
validate_result = subprocess.run(["terraform", "validate", tf_dir],
capture_output=True, text=True)
# tflint — дополнительные проверки
tflint_result = subprocess.run(["tflint", "--format=json", tf_dir],
capture_output=True, text=True)
# checkov — security checks
checkov_result = subprocess.run(
["checkov", "-d", tf_dir, "--framework", "terraform", "-o", "json"],
capture_output=True, text=True
)
return ValidationResult(
fmt_ok=fmt_result.returncode == 0,
valid=validate_result.returncode == 0,
validation_errors=validate_result.stderr,
security_issues=json.loads(checkov_result.stdout).get("results", {}).get("failed_checks", []),
)
Генерация Kubernetes манифестов
def generate_k8s_manifests(app_config: AppConfig) -> dict[str, str]:
prompt = f"""Сгенерируй Kubernetes манифесты для деплоя приложения.
Приложение: {app_config.name}
Image: {app_config.image}
Порт: {app_config.port}
Реплики: {app_config.replicas}
CPU: {app_config.cpu_request}/{app_config.cpu_limit}
Memory: {app_config.memory_request}/{app_config.memory_limit}
Environment vars: {app_config.env_vars}
Needs: {app_config.needs} # "database", "redis", "ingress"
Создай: Deployment, Service, HPA, ConfigMap, PodDisruptionBudget, NetworkPolicy."""
return parse_k8s_yaml(llm.generate(prompt, max_tokens=4000))
Drift detection
После применения IaC — регулярная проверка дрейфа: фактическая инфраструктура vs конфигурация в коде. terraform plan в dry-run режиме. Если есть расхождения — алерт и автоматический PR с предлагаемым исправлением.
Подводные камни AI-генерации IaC
- Устаревший синтаксис: LLM обучен на старых версиях Terraform, использует deprecated ресурсы. Решение: явно указывать target версию провайдера в промпте + валидация.
- Security anti-patterns: открытые security groups, отсутствие encryption at rest. Решение: checkov после генерации + security-focused постинструкция.
-
Hardcoded credentials: LLM иногда вставляет placeholder вида
access_key = "AKIAXXXXXXX". Решение: grep по паттернам credentials перед PR.







