Работали ли вы с Auto Scaling Groups (AWS)?

«Работали ли вы с Auto Scaling Groups (AWS)?» — вопрос из категории Облачные платформы, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, активно работал с Auto Scaling Groups (ASG) в AWS для построения отказоустойчивых и масштабируемых архитектур.

Мой опыт включает:

  • Создание и настройка ASG через AWS Console, CLI, и, что важнее, через инфраструктуру как код (IaC) — Terraform и CloudFormation.
  • Настройка политик масштабирования:
    • Target Tracking Scaling: Например, поддержание среднего использования CPU на уровне 70%.
    • Step Scaling: Реагирование на кастомные CloudWatch метрики (например, длина очереди сообщений в SQS) с разными шагами действий.
    • Scheduled Scaling: Плановое увеличение/уменьшение емкости перед пиковыми нагрузками.
  • Интеграция с другими сервисами: Привязка ASG к Application Load Balancer (ALB) или Network Load Balancer (NLB) для распределения трафика. Настройка Health Checks как от EC2, так и от ELB.
  • Использование Lifecycle Hooks для выполнения кастомных скриптов при запуске (например, дополнительная конфигурация) или завершении работы инстанса (например, graceful shutdown и дренаж трафика).

Пример декларации ASG в Terraform:

resource "aws_autoscaling_group" "web_app" {
  name_prefix          = "web-app-asg-"
  min_size             = 2
  max_size             = 10
  desired_capacity     = 2
  vpc_zone_identifier  = data.aws_subnets.private.ids
  health_check_type    = "ELB"
  target_group_arns    = [aws_lb_target_group.app.arn]

  launch_template {
    id      = aws_launch_template.app.id
    version = "$Latest"
  }

  tag {
    key                 = "Name"
    value               = "Web-App-Instance"
    propagate_at_launch = true
  }
}

resource "aws_autoscaling_policy" "scale_on_cpu" {
  name                   = "scale-on-cpu"
  autoscaling_group_name = aws_autoscaling_group.web_app.name
  policy_type            = "TargetTrackingScaling"

  target_tracking_configuration {
    predefined_metric_specification {
      predefined_metric_type = "ASGAverageCPUUtilization"
    }
    target_value = 70.0
  }
}

Это позволяет автоматически поддерживать производительность приложения при изменении нагрузки и минимизировать затраты в периоды простоя.