Infrastructure as Code: IaC

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

Зачем нужно

Ручная настройка инфраструктуры через веб-консоль — непрозрачна и не воспроизводима. Через месяц никто не помнит, что именно и как было настроено. IaC решает это: инфраструктура описана в коде, изменения проходят через PR, откат возможен через git revert. Поднять полную копию окружения — одна команда.

Где используется

  • Terraform: создание облачных ресурсов (AWS, GCP, Azure)
  • Ansible: настройка операционной системы и приложений на серверах
  • Kubernetes manifests: описание деплоев, сервисов, конфигов
  • Pulumi: IaC на TypeScript/Python вместо HCL

Основной контент

Инструменты IaC

Инструмент Уровень Язык Для чего
Terraform Провизионирование HCL Создание облачных ресурсов
Ansible Конфигурация YAML Настройка серверов
Pulumi Провизионирование TS/Python/Go Альтернатива Terraform
Kubernetes YAML Оркестрация YAML Деплой в K8s
CloudFormation Провизионирование YAML/JSON AWS-специфично

Terraform пример

# main.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
  backend "s3" {
    bucket = "my-terraform-state"
    key    = "prod/terraform.tfstate"
    region = "eu-west-1"
  }
}

provider "aws" {
  region = var.region
}

# EC2 инстанс
resource "aws_instance" "api" {
  ami           = data.aws_ami.amazon_linux.id
  instance_type = var.instance_type
  key_name      = aws_key_pair.deployer.key_name

  vpc_security_group_ids = [aws_security_group.api.id]

  tags = {
    Name        = "${var.app_name}-api"
    Environment = var.environment
  }
}

# S3 бакет
resource "aws_s3_bucket" "static" {
  bucket = "${var.app_name}-static-${var.environment}"
}

# Вывод
output "api_public_ip" {
  value = aws_instance.api.public_ip
}
# Рабочий цикл Terraform
terraform init          # загрузить провайдеры
terraform plan          # показать что будет сделано (dry-run)
terraform apply         # применить изменения (попросит подтверждение)
terraform destroy       # уничтожить инфраструктуру

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

Декларативный (Terraform, Kubernetes YAML):
"Я хочу 3 сервера с такими-то параметрами" → система сама определяет КАК

Императивный (Bash-скрипты):
"Запусти команду X, потом Y, потом Z" → порядок важен, нет идемпотентности

Принципы хорошего IaC

1. Идемпотентность: применение одного и того же кода N раз → одинаковый результат
2. Версионность: весь код в Git с историей изменений
3. Модульность: переиспользуемые модули для типовых ресурсов
4. Секреты не в коде: Vault, AWS Secrets Manager, .tfvars вне Git

Частые ошибки

  • Хранить terraform.tfstate локально — при работе в команде состояние должно быть в S3 или Terraform Cloud
  • Изменять инфраструктуру вручную в консоли после применения Terraform — drift между кодом и реальностью
  • Хранить секреты (API-ключи, пароли) в *.tf или *.tfvars файлах в Git

Связанные темы

Ресурсы