Урок 5-7: Управление ресурсами в AWS
Часть 1: Изменение ресурсов
Изменение существующих ресурсов
Перед изменением
resource "aws_eip" "web" {
domain = "vpc"
tags = {
Name = "web-eip"
Environment = "production"
}
}
После изменения
resource "aws_eip" "web" {
domain = "vpc"
tags = {
Name = "web-eip"
Environment = "production"
Team = "devops" # Добавили новый tag
CostCenter = "engineering"
}
}
Применение изменений
# Просмотр плана изменений
terraform plan
# Вывод будет показывать:
# ~ aws_eip.web (update in-place)
# ~ tags = {...}
# + "CostCenter" = "engineering"
# + "Team" = "devops"
# Применить изменения
terraform apply
Типы изменений
| Тип | Символ | Описание |
|---|---|---|
| Создание | + | Будет создан новый ресурс |
| Изменение | ~ | Ресурс будет изменен на месте |
| Пересоздание | -/+ | Ресурс будет удален и создан заново |
| Удаление | - | Ресурс будет удален |
Beispiel: Изменение размера EC2
# Было
resource "aws_instance" "web" {
instance_type = "t2.micro"
# ... остальные параметры
}
# Стало
resource "aws_instance" "web" {
instance_type = "t2.small" # Увеличили размер
# ... остальные параметры
}
# После terraform plan увидите:
# ~ aws_instance.web (update in-place)
# ~ instance_type = "t2.micro" -> "t2.small"
Часть 2: Удаление ресурсов
Способ 1: terraform destroy
# Удалить все ресурсы
terraform destroy
# Удалить конкретный ресурс
terraform destroy -target=aws_eip.web
# Удалить несколько ресурсов
terraform destroy -target=aws_instance.web -target=aws_security_group.web
Способ 2: Удалить из конфига
# Удалить эти строки из main.tf
resource "aws_eip" "web" {
domain = "vpc"
tags = { Name = "web-eip" }
}
# Затем
terraform apply # Terraform автоматически удалит ресурс
Способ 3: Terraform state
# Удалить ресурс из состояния (но НЕ из AWS!)
terraform state rm aws_eip.web
# Удалить несколько
terraform state rm 'aws_instance.web' 'aws_security_group.web'
# Импортировать ресурс обратно
terraform import aws_eip.web <allocation-id>
Защита от случайного удаления
resource "aws_eip" "web" {
domain = "vpc"
lifecycle {
prevent_destroy = true # Запретить удаление
}
tags = {
Name = "web-eip"
}
}
Теперь при попытке terraform destroy:
Error: Instance cannot be destroyed
on main.tf line 1, in resource "aws_eip" "web":
1: resource "aws_eip" "web" {
Resource instance aws_eip.web has lifecycle.prevent_destroy set, so it cannot be destroyed.
Полный workflow: Создание → Изменение → Удаление
Этап 1: Инициализация
# Создать директорию проекта
mkdir terraform-project
cd terraform-project
# Инициализировать
terraform init
Этап 2: Создание ресурсов
Файл: main.tf
resource "aws_security_group" "web" {
name = "web-sg"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.web.id]
tags = {
Name = "web-server"
}
}
# Просмотр плана
terraform plan
# Применение
terraform apply -auto-approve
Этап 3: Изменение ресурсов
# Обновить instance_type
resource "aws_instance" "web" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.small" # Изменение
vpc_security_group_ids = [aws_security_group.web.id]
tags = {
Name = "web-server"
}
}
# Просмотр плана
terraform plan
# Применение
terraform apply -auto-approve
Этап 4: Удаление ресурсов
# Просмотр того, что будет удалено
terraform plan -destroy
# Удалить все
terraform destroy -auto-approve
Мониторинг изменений
Команда terraform show
# Просмотр текущего состояния
terraform show
# Вывод конкретного ресурса
terraform show aws_instance.web
# В формате JSON
terraform show -json | jq .
Команда terraform state
# Список всех ресурсов
terraform state list
# Информация о ресурсе
terraform state show aws_instance.web
# Удалить из состояния
terraform state rm aws_instance.web
# Переместить ресурс
terraform state mv aws_instance.web aws_instance.web_old
# Вытянуть состояние
terraform state pull > terraform.tfstate.backup
# Загрузить состояние
terraform state push terraform.tfstate.backup
Команда terraform validate
# Проверить синтаксис конфигурации
terraform validate
# Выведет ошибки, если они есть
Откат изменений
Сценарий: Допустили ошибку при изменении
# 1. Просмотреть старое состояние
terraform state show aws_instance.web
# 2. Восстановить из backup
terraform state push terraform.tfstate.backup
# 3. Применить старую конфигурацию
terraform apply -auto-approve
Сценарий: Нужно откатить к предыдущей версии кода
# Если используете Git
git log --oneline
# Откатить к предыдущему коммиту
git checkout HEAD~1
# Применить старую конфигурацию
terraform apply
Лучшие практики управления ресурсами
✅ Делайте
- ✅ Всегда использовать
terraform planпередapply - ✅ Хранить состояние в Remote State (S3, Terraform Cloud)
- ✅ Использовать
lifecycle.prevent_destroyдля критичных ресурсов - ✅ Версионировать конфигурацию через Git
- ✅ Проверять план перед применением
❌ Не делайте
- ❌ Редактировать
terraform.tfstateвручную - ❌ Удалять ресурсы вручную в AWS (будет несоответствие состояния)
- ❌ Коммитить
.tfstateв Git - ❌ Запускать
terraform applyбез просмотра плана - ❌ Делить state файл между проектами
Автоматизация: Скрипт для безопасного развертывания
#!/bin/bash
set -e
# Цвета для вывода
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color
echo "=== Terraform Deployment Script ==="
# 1. Валидация
echo "Validating Terraform configuration..."
terraform validate
# 2. Форматирование
echo "Formatting code..."
terraform fmt -recursive
# 3. План
echo "Creating plan..."
terraform plan -out=tfplan
# 4. Подтверждение
read -p "Do you want to apply these changes? (yes/no): " confirmation
if [ "$confirmation" != "yes" ]; then
echo "Deployment cancelled."
exit 0
fi
# 5. Применение
echo "Applying configuration..."
terraform apply tfplan
echo -e "${GREEN}Deployment completed successfully!${NC}"
# 6. Вывод результатов
echo "=== Outputs ==="
terraform output
Сохраните как deploy.sh и используйте:
chmod +x deploy.sh
./deploy.sh