Есть ли у вас опыт работы с Terraform?

Ответ

Да, я использовал Terraform для управления инфраструктурой как код (IaC) в нескольких проектах. Основной опыт связан с провайдерами AWS и GCP.

Примеры задач:

  • Создание модульных конфигураций для виртуальных машин, сетей (VPC, подсети, security groups), балансировщиков нагрузки и баз данных (RDS, Cloud SQL).
  • Рефакторинг монолитных конфигураций в переиспользуемые модули для командной работы.
  • Управление состоянием (state) через Terraform Cloud с блокировками и историей изменений.
  • Интеграция с CI/CD (GitLab CI) для автоматического планирования и применения изменений после code review.

Пример создания EC2-инстанса в AWS:

resource "aws_instance" "app_server" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t3.micro"
  subnet_id     = module.vpc.public_subnets[0]

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

Используемые практики: модульная структура, remote state в S3 с блокировкой через DynamoDB, использование workspaces для разделения сред (dev/stage/prod), валидация кода с terraform validate и tflint.

Ответ 18+ 🔞

А, Terraform, говоришь? Ну да, работал с этой штукой, ебать мои старые костыли. Инфраструктуру как код настраивал, IaC, короче. В основном с AWS и GCP возился.

Что конкретно делал, ёпта:

  • Писал эти конфиги, чтобы всё само разворачивалось — сервера, сети всякие, балансировщики, базы данных. Не вручную же, как в каменном веке, кнопки тыкать.
  • Бывало, достанешь legacy-конфигурацию — один файл на овердохуища строк, в нём всё намешано. Приходилось это всё в нормальные, переиспользуемые модули пилить, чтобы команда не с ума сошла.
  • Состояние (этот самый state) хранил в Terraform Cloud, чтобы не было каши, когда несколько человек лезут. Блокировки там, история — красота.
  • В CI/CD цепочку встраивал (у нас GitLab CI был), чтобы после мержа кода в мастер всё само прогонялось plan и, если ок, apply.

Вот, смотри, как простенький сервер в AWS поднимается. Код не трогаю, он и так норм:

resource "aws_instance" "app_server" {
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t3.micro"
  subnet_id     = module.vpc.public_subnets[0]

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

А по фэн-шую я делал так: всё модулями, state не локально, а в удалённом бекенде (обычно S3), с блокировкой через DynamoDB, чтобы два дурака одновременно не накосячили. Для разных сред (dev, stage, prod) использовал workspaces. И, конечно, перед тем как что-то применять, гонял terraform validate и tflint — доверия к рукам, ебать, ноль, лучше пусть линтер поругается.