Налаштування балансування навантаження через 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 допоможе глибше розібратися в можливостях.







