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
Связанные темы
- _MOC DevOps
- Terraform -- основы
- Ansible -- обзор
- GitOps -- принципы
- AWS -- обзор сервисов для веб-разработчика