Ошибка 1: Забыть выполнить terraform destroy
Причина: после 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: Конфигурация применена, но инфраструктура не совпадает
Решение:
# Обновить 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"
# Обратите внимание на строки с символами:
# + создать ресурс
# - удалить ресурс
# ~ изменить на месте
# -/+ удалить и пересоздать (самое опасное!)