Урок 5-7: Управление ресурсами в AWS

Pavel 08.12.2025 18:56 5 просмотров

Часть 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

Комментарии (0)

Для добавления комментария необходимо войти в аккаунт

Войти / Зарегистрироваться