Какие плюсы и минусы у подхода «инфраструктура как код» (IaC)?

«Какие плюсы и минусы у подхода «инфраструктура как код» (IaC)?» — вопрос из категории Terraform, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Работая с Terraform и CloudFormation, я на практике столкнулся со следующими преимуществами и сложностями IaC.

Плюсы:

  • Консистентность и повторяемость: Идентичные staging и production-окружения в AWS/GCP/Azure создаются из одного набора конфигураций. Исключаются дрейфы конфигураций из-за ручных правок.
  • Версионность и контроль изменений: Весь код инфраструктуры хранится в Git. Можно использовать pull requests, code review, видеть историю изменений (git log) и понимать, кто и зачем добавил тот или иной security group rule.
  • Быстрое восстановление и масштабирование: При потере окружения (например, региона AWS) его можно развернуть заново запуском terraform apply. Автоматическое масштабирование групп инстансов (ASG) также описывается кодом.
  • Документация и прозрачность: Файлы .tf сами по себе являются актуальной документацией текущего состояния инфраструктуры, что критично для онбординга новых инженеров.
  • Безопасность и compliance: Интеграция с инструментами статического анализа кода (например, checkov, tfsec) для поиска небезопасных конфигураций прямо на этапе CI.

Минусы:

  • Критическая зависимость от state-файла: Потеря или повреждение .tfstate файла в Terraform может привести к катастрофическим последствиям. Требует надежной бэкап-стратегии и использования remote state (например, в S3 с блокировками через DynamoDB).
  • Сложность обучения и начальные затраты: Команде нужно освоить новый язык (HCL), принципы идиоматичного Terraform (модули, workspaces), что требует времени.
  • Ограничения и лаг провайдеров: Не все новейшие сервисы или фичи облачного провайдера сразу доступны в провайдере Terraform. Иногда приходится ждать обновления или использовать workarounds.
  • Управление сложностью: Большая кодовая база инфраструктуры может стать громоздкой. Требуется дисциплина в организации модулей, использовании переменных и outputs, чтобы избежать спагетти-кода.

Пример модуля Terraform для создания безопасной VPC:

# modules/secure-vpc/main.tf
resource "aws_vpc" "main" {
  cidr_block           = var.cidr_block
  enable_dns_hostnames = true
  tags = {
    Name = "${var.environment}-vpc"
  }
}

resource "aws_flow_log" "vpc_flow_log" {
  vpc_id               = aws_vpc.main.id
  traffic_type         = "ALL"
  log_destination_type = "cloud-watch-logs"
  # ... настройка CloudWatch Logs
}

# Использование модуля
module "prod_vpc" {
  source       = "./modules/secure-vpc"
  cidr_block   = "10.0.0.0/16"
  environment  = "production"
}