🐛 Типичные ошибки при работе с Terraform

⚡ Топ-3 ошибки

  1. Забытый terraform destroy — ресурсы работают и тарифицируются даже если вы о них забыли
  2. Секреты в gitterraform.tfvars с ключами AWS попал в публичный репозиторий
  3. Одинаковые имена ресурсов — два ресурса S3 с одинаковым именем; у S3 имена глобально уникальны

Ошибка 1: Забыть выполнить terraform destroy

Симптом: AWS продолжает тарифицировать EC2-инстанс, RDS-базу или другие ресурсы спустя дни/недели после учёбы.

Причина: после terraform apply ресурсы остаются запущенными до явного удаления. Terraform не удаляет их автоматически.

Решение:

# Терминал — всегда после завершения практики!
terraform destroy -var-file="terraform.tfvars"
# Введите "yes"

# Проверить, что ресурсы удалены
aws s3 ls                             # бакеты
aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId,State.Name]' --output table

Профилактика: в учебном окружении всегда ставьте напоминание на удаление. Для prod — настройте Cost Alerts в AWS Billing.


Ошибка 2: Секреты в git

Симптом: terraform.tfvars с реальными AWS Access Keys попал в git-репозиторий (особенно публичный).
# terraform.tfvars — ОПАСНО, если содержит реальные ключи и попадёт в git
aws_access_key_id     = "AKIAIOSFODNN7EXAMPLE"
aws_secret_access_key = "wJalrXUtnFEMI/K7MDENG"

Решение: правильная структура хранения секретов:

# .gitignore — добавить в начале проекта
*.tfvars          # все файлы с переменными (если содержат секреты)
*.tfstate         # файлы состояния
*.tfstate.backup  # резервные копии state
.terraform/       # директория с провайдерами

# Использовать ~/.aws/credentials (настроить через aws configure)
# Terraform читает оттуда автоматически без передачи в код

Ошибка 3: Одинаковые имена S3-бакетов

Симптом: terraform apply падает с ошибкой BucketAlreadyExists или BucketAlreadyOwnedByYou.
# Ошибка в лекции: "Убедитесь, что в .terraform.tfvars указаны уникальные названия,
# иначе применение завершится с ошибкой"

Имена S3-бакетов глобально уникальны среди всех AWS-аккаунтов в мире. Два студента с одинаковым именем — ошибка у второго.

Решение:

# terraform.tfvars — уникальное имя с префиксом вашей группы и имени
bucket_name = "pd2025-myname-bucket"

# Либо использовать random суффикс через Terraform random provider
resource "random_string" "suffix" {
  length  = 6
  special = false
  upper   = false
}

resource "aws_s3_bucket" "app_bucket" {
  bucket = "myapp-${random_string.suffix.result}"
}

Ошибка 4: Забыть terraform init перед apply

Симптом: ошибка Error: Could not load plugin или Provider registry.terraform.io/hashicorp/aws: no suitable version installed.

Причина: провайдер AWS не скачан — не была выполнена инициализация.

Решение:

# Терминал — всегда первым шагом в новой директории
terraform init

# Если провайдеры уже есть, но хотите обновить
terraform init -upgrade

Ошибка 5: Конфигурация применена, но инфраструктура не совпадает

Симптом: кто-то изменил ресурс вручную в консоли AWS — Terraform не знает об этом, state расходится с реальностью.

Решение:

# Обновить state — синхронизировать с реальным состоянием в AWS
terraform refresh

# Посмотреть расхождения
terraform plan    # покажет, что «изменилось» (хотя мы не меняли код)

Профилактика: при использовании Terraform — не вносить изменения вручную через консоль или CLI. Всё через код.


Ошибка 6: AMI ID указан неправильно или для другого региона

Симптом: Error: InvalidAMIID.NotFound: The image id '[ami-XXXXXX]' does not exist.

Причина: AMI ID специфичны для конкретного региона. AMI из eu-central-1 не работает в us-east-1.

Решение:

# Найти актуальный AMI для региона через AWS CLI
aws ec2 describe-images \
  --owners amazon \
  --filters "Name=name,Values=al2023-ami-*-x86_64" \
  --query 'sort_by(Images, &CreationDate)[-1].ImageId' \
  --output text \
  --region eu-central-1

# Или использовать data source в Terraform (не хардкодить ID)
data "aws_ami" "amazon_linux" {
  most_recent = true
  owners      = ["amazon"]
  filter {
    name   = "name"
    values = ["al2023-ami-*-x86_64"]
  }
}

Ошибка 7: Потеря файла terraform.tfstate

Симптом: файл terraform.tfstate удалён или повреждён. Terraform больше не «знает» о созданных ресурсах.

Последствия: terraform destroy ничего не удалит — ресурсы продолжат тарифицироваться. Ручное удаление через консоль AWS.

Решение для команд:

# backend.tf — remote state в S3 (не теряется, синхронизирован)
terraform {
  backend "s3" {
    bucket = "company-terraform-state"
    key    = "project/terraform.tfstate"
    region = "eu-central-1"
    encrypt = true
  }
}

Если state потерян, а ресурсы существуют — используйте terraform import для восстановления связи:

# Терминал — импортировать существующий S3-бакет в state
terraform import aws_s3_bucket.app_bucket my-existing-bucket-name

Ошибка 8: Запуск terraform apply без terraform plan

Симптом: terraform apply удалил или пересоздал ресурс, которого вы не хотели трогать.

Причина: некоторые изменения в конфигурации (например, смена instance_type или subnet_id) требуют пересоздания ресурса — Terraform покажет это в plan.

Решение:

# Всегда проверяйте план перед apply!
terraform plan -var-file="terraform.tfvars"

# Обратите внимание на строки с символами:
# + создать ресурс
# - удалить ресурс
# ~ изменить на месте
# -/+ удалить и пересоздать (самое опасное!)