Налаштування балансування навантаження через AWS ALB та ELB
Сайт падає під навантаженням? 502 помилки при пікових запитах у день акції? Ми стикалися з цим у проектах з трафіком 100k+ RPS. Балансування навантаження через AWS ALB — стандартне рішення для високонавантажених проектів. Налаштовуємо ALB/ELB під ключ: target groups, listener rules, SSL, інтеграція з Auto Scaling. Досвід 7+ років, 50+ налаштованих балансувальників. Правильна конфігурація ALB критична для доступності та швидкості сайту — істотна економія на інфраструктурі при грамотному налаштуванні.
AWS надає керовані балансувальники навантаження без необхідності підтримувати власний сервер. Application Load Balancer (ALB) працює на рівні HTTP/HTTPS з маршрутизацією за шляхом та заголовками. Network Load Balancer (NLB) — L4 TCP/UDP з мінімальною затримкою. Classic ELB застарів і не рекомендується для нових проектів.
Чому варто обрати ALB замість NLB?
ALB кращий за NLB для HTTP/HTTPS: він підтримує інтелектуальну маршрутизацію, інтеграцію з WAF та віддачу статичного контенту. NLB незамінний для TCP-сервісів, що потребують статичних IP та мінімальної затримки. Якщо у вас веб-додаток на React/Vue або API на Node.js — ваш вибір ALB. Для GameServer або VoIP — NLB. Ми часто комбінуємо їх: ALB для вебу, NLB для WebSocket.
| Характеристика | ALB (L7) | NLB (L4) |
|---|---|---|
| Протоколи | HTTP/HTTPS/gRPC | TCP/UDP/TLS |
| Маршрутизація | за шляхом, заголовком, хостом | немає |
| Інтеграція з WAF | так | ні |
| Статичний IP | ні | так (через Elastic IP) |
| Затримка | ~2-5 мс | <1 мс |
| Цільові групи | EC2, ECS, Lambda, IP | EC2, IP, ALB |
Як працює ALB з Auto Scaling?
Прив'яжіть target group ALB до Auto Scaling Group. При масштабуванні нові інстанси автоматично реєструються та починають отримувати трафік. Health check ALB (шлях /health, поріг 2 успішних відповідей) визначає, коли інстанс готовий приймати запити. Це забезпечує zero-downtime деплой. Для критичних сервісів використовуємо таргет-групи з deregistration_delay у 30 секунд, щоб запити, що тривають, завершилися.
Покрокове налаштування ALB через Terraform
- Створіть ALB із зазначенням security groups та підмереж.
- Налаштуйте HTTPS listener з сертифікатом ACM та редирект з HTTP.
- Визначте target groups з health check та stickiness.
- Додайте listener rules для маршрутизації за шляхами, заголовками або хостами.
- Прив'яжіть target group до вашого сервісу (EC2, ECS, Lambda).
- Увімкніть access logs та моніторинг.
Повний приклад конфігурації нижче.
Application Load Balancer
ALB — стандартний вибір для веб-додатків. Маршрутизує за шляхом, хостом, HTTP-заголовками, методом, query string. Інтегрується з ECS, EKS, Lambda, Auto Scaling Groups. Нижче повна конфігурація з AWS ALB, маршрутизацією та ACM.
# Terraform: повна конфігурація ALB + routing + ACM resource "aws_lb" "main" { name = "myapp-alb" internal = false load_balancer_type = "application" security_groups = [aws_security_group.alb.id] subnets = aws_subnet.public[*].id enable_deletion_protection = true enable_cross_zone_load_balancing = true drop_invalid_header_fields = true access_logs { bucket = aws_s3_bucket.alb_logs.bucket prefix = "alb" enabled = true } tags = { Name = "myapp-alb" } } # HTTPS Listener resource "aws_lb_listener" "https" { load_balancer_arn = aws_lb.main.arn port = 443 protocol = "HTTPS" ssl_policy = "ELBSecurityPolicy-TLS13-1-2-2021-06" certificate_arn = aws_acm_certificate.main.arn default_action { type = "forward" target_group_arn = aws_lb_target_group.web.arn } } # HTTP → HTTPS redirect resource "aws_lb_listener" "http" { load_balancer_arn = aws_lb.main.arn port = 80 protocol = "HTTP" default_action { type = "redirect" redirect { port = "443" protocol = "HTTPS" status_code = "HTTP_301" } } } # Target Group для веб-додатку resource "aws_lb_target_group" "web" { name = "myapp-web-tg" port = 8080 protocol = "HTTP" vpc_id = aws_vpc.main.id target_type = "ip" # для ECS Fargate health_check { enabled = true path = "/health" healthy_threshold = 2 unhealthy_threshold = 3 timeout = 5 interval = 10 matcher = "200" } deregistration_delay = 30 stickiness { type = "lb_cookie" cookie_duration = 86400 enabled = false } } # API Target Group resource "aws_lb_target_group" "api" { name = "myapp-api-tg" port = 3000 protocol = "HTTP" vpc_id = aws_vpc.main.id health_check { path = "/api/health" matcher = "200" } } # Правила маршрутизації resource "aws_lb_listener_rule" "api" { listener_arn = aws_lb_listener.https.arn priority = 10 action { type = "forward" target_group_arn = aws_lb_target_group.api.arn } condition { path_pattern { values = ["/api/*"] } } } # Маршрут за заголовком (версіонування API) resource "aws_lb_listener_rule" "api_v2" { listener_arn = aws_lb_listener.https.arn priority = 5 action { type = "forward" target_group_arn = aws_lb_target_group.api_v2.arn } condition { http_header { http_header_name = "X-API-Version" values = ["2", "2.0"] } } } # Weighted forwarding для Canary deployments resource "aws_lb_listener_rule" "canary" { listener_arn = aws_lb_listener.https.arn priority = 20 action { type = "forward" forward { target_group { arn = aws_lb_target_group.web_stable.arn weight = 95 } target_group { arn = aws_lb_target_group.web_canary.arn weight = 5 } stickiness { enabled = true duration = 3600 } } } condition { path_pattern { values = ["/*"] } } } # Сертифікат ACM resource "aws_acm_certificate" "main" { domain_name = "example.com" subject_alternative_names = ["*.example.com"] validation_method = "DNS" lifecycle { create_before_destroy = true } } resource "aws_route53_record" "cert_validation" { for_each = { for dvo in aws_acm_certificate.main.domain_validation_options : dvo.domain_name => { name = dvo.resource_record_name record = dvo.resource_record_value type = dvo.resource_record_type } } zone_id = aws_route53_zone.main.zone_id name = each.value.name type = each.value.type ttl = 60 records = [each.value.record] } resource "aws_acm_certificate_validation" "main" { certificate_arn = aws_acm_certificate.main.arn validation_record_fqdns = [for record in aws_route53_record.cert_validation : record.fqdn] } ALB + WAF
Підключаємо WAF для захисту від OWASP top-10 та rate limiting.
resource "aws_wafv2_web_acl_association" "alb" { resource_arn = aws_lb.main.arn web_acl_arn = aws_wafv2_web_acl.main.arn } resource "aws_wafv2_web_acl" "main" { name = "myapp-waf" scope = "REGIONAL" default_action { allow {} } rule { name = "AWSManagedRulesCommonRuleSet" priority = 1 override_action { none {} } statement { managed_rule_group_statement { name = "AWSManagedRulesCommonRuleSet" vendor_name = "AWS" } } visibility_config { cloudwatch_metrics_enabled = true metric_name = "CommonRuleSet" sampled_requests_enabled = true } } rule { name = "RateLimit" priority = 2 action { block {} } statement { rate_based_statement { limit = 2000 aggregate_key_type = "IP" } } visibility_config { cloudwatch_metrics_enabled = true metric_name = "RateLimit" sampled_requests_enabled = true } } visibility_config { cloudwatch_metrics_enabled = true metric_name = "MyAppWAF" sampled_requests_enabled = true } } ALB + ECS Fargate
Приклад інтеграції ALB з Fargate: сервіс автоматично реєструється в target group.
resource "aws_ecs_service" "app" { name = "myapp-web" cluster = aws_ecs_cluster.main.id task_definition = aws_ecs_task_definition.app.arn desired_count = 3 launch_type = "FARGATE" network_configuration { subnets = aws_subnet.private[*].id security_groups = [aws_security_group.app.id] assign_public_ip = false } load_balancer { target_group_arn = aws_lb_target_group.web.arn container_name = "web" container_port = 8080 } deployment_circuit_breaker { enable = true rollback = true } deployment_controller { type = "ECS" } depends_on = [aws_lb_listener.https] } Network Load Balancer
NLB для TCP/UDP зі статичними IP та мінімальною затримкою.
resource "aws_lb" "nlb" { name = "myapp-nlb" internal = false load_balancer_type = "network" subnets = aws_subnet.public[*].id enable_cross_zone_load_balancing = true } resource "aws_lb_listener" "nlb_tls" { load_balancer_arn = aws_lb.nlb.arn port = 443 protocol = "TLS" ssl_policy = "ELBSecurityPolicy-TLS13-1-2-2021-06" certificate_arn = aws_acm_certificate.main.arn default_action { type = "forward" target_group_arn = aws_lb_target_group.nlb_tcp.arn } } resource "aws_lb_target_group" "nlb_tcp" { name = "myapp-nlb-tg" port = 8080 protocol = "TCP" vpc_id = aws_vpc.main.id health_check { protocol = "HTTP" path = "/health" healthy_threshold = 2 unhealthy_threshold = 2 interval = 10 } } Моніторинг ALB
Ключові метрики CloudWatch: RequestCount, ActiveConnectionCount, TargetResponseTime (p50/p95/p99), HTTPCode_ELB_5XX_Count, HealthyHostCount, UnHealthyHostCount. Ставимо алерти на 5xx та високу затримку.
resource "aws_cloudwatch_metric_alarm" "target_5xx" { alarm_name = "alb-5xx-errors" comparison_operator = "GreaterThanThreshold" evaluation_periods = 2 metric_name = "HTTPCode_Target_5XX_Count" namespace = "AWS/ApplicationELB" period = 60 statistic = "Sum" threshold = 10 alarm_actions = [aws_sns_topic.alerts.arn] dimensions = { LoadBalancer = aws_lb.main.arn_suffix } } resource "aws_cloudwatch_metric_alarm" "latency" { alarm_name = "alb-high-latency" comparison_operator = "GreaterThanThreshold" evaluation_periods = 3 metric_name = "TargetResponseTime" namespace = "AWS/ApplicationELB" period = 60 extended_statistic = "p95" threshold = 2.0 alarm_actions = [aws_sns_topic.alerts.arn] dimensions = { LoadBalancer = aws_lb.main.arn_suffix } } Що входить в роботу
- Проект балансування: вибір типу (ALB/NLB), схема мережі.
- Написання Terraform-коду з target groups, listener rules, ACM, WAF.
- Налаштування моніторингу та алертів.
- Інтеграція з CI/CD та Auto Scaling.
- Документація з експлуатації та навчання команди.
Терміни реалізації
| Конфігурація | Термін |
|---|---|
| ALB + Target Group + HTTPS | 1–2 дні |
| Маршрутизація за шляхами/заголовками | +1 день |
| WAF + rate limiting | +1–2 дні |
| Canary deployment через weighted forwarding | +1 день |
| Повна Terraform конфігурація з моніторингом | 3–5 днів |
Типові помилки при налаштуванні
- Не налаштований health check — інстанси отримують трафік до готовності.
- Відсутній deletion protection — випадкове видалення ALB.
- Неправильна SSL policy — вразливості.
- Click-through на WAF — не включені managed rules.
Ми гарантуємо стабільність та швидкість. Отримайте консультацію з налаштування ALB для вашого проекту. Зв'яжіться з нами — розрахуємо терміни під ваш проект. Документація AWS ALB допоможе глибше розібратися в можливостях.







