$10k/Mesiac AWS Chyba: NAT Gateway vs VPC Endpoints
Vsimol som si to az vtedy, ked nas AWS bill zacal vyzerat ako telefonne cislo. “Prečo je náš AWS data transfer účet $15,000/mesiac?” Skontroloval som architektúru: privátne subnety smerujúce všetok traffic cez NAT Gateway. Vrátane S3 a DynamoDB. To je platenie za traffic ktorý by mal byť zadarmo.
Testované na: AWS us-east-1, EKS cluster s 50 nodmi, 100TB/mesiac S3 traffic
Problém
Typický Private Subnet Setup
Default architektúra (drahá):
┌─────────────────────────────────────────────────────────────┐
│ Private Subnet │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ EKS │ │ EKS │ │ EKS │ │
│ │ Node │ │ Node │ │ Node │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ │ │ │
│ └────────────┼────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────┐ │
│ │ NAT │ ← $0.045/GB data processing │
│ │ Gateway │ ← $0.045/hodina per gateway │
│ └────┬─────┘ │
└───────────────────┼─────────────────────────────────────────┘
│
▼
┌───────────────┐
│ Internet │
│ Gateway │
└───────┬───────┘
│
┌───────────┼───────────┐
▼ ▼ ▼
┌──────┐ ┌─────────┐ ┌───────┐
│ S3 │ │DynamoDB │ │ ECR │
└──────┘ └─────────┘ └───────┘
Všetok AWS service traffic ide cez NAT = platenie za bezplatný traffic
Rozpis Nákladov
Scenár: 100TB/mesiac S3 traffic z privátneho subnetu
Cez NAT Gateway:
Data processing: 100,000 GB × $0.045 = $4,500/mesiac
Hodinový poplatok: 720 hodín × $0.045 × 3 AZs = $97/mesiac
Celkový NAT cost: $4,597/mesiac
Cez VPC Gateway Endpoint (S3):
Data processing: $0 (zadarmo!)
Hodinový poplatok: $0 (zadarmo!)
Celkom: $0/mesiac
Mesačná úspora: $4,597
Ročná úspora: $55,164
A to je len S3. Pridaj DynamoDB, ECR, a ďalšie služby...
Typy VPC Endpoints
Gateway Endpoints (Zadarmo)
Podporované služby:
- S3
- DynamoDB
Charakteristiky:
- Route table záznam (žiadny ENI)
- Žiadne hodinové ani dátové poplatky
- Regionálny rozsah
- Musí byť v rovnakom regióne ako bucket/tabuľka
Interface Endpoints (Platené)
Podporované služby:
- ECR (ecr.api, ecr.dkr)
- Secrets Manager
- SSM
- CloudWatch
- SQS, SNS
- A 100+ ďalších
Charakteristiky:
- ENI vo vašom subnete
- $0.01/hodina per AZ
- $0.01/GB spracovaných dát
- Ale STÁLE lacnejšie ako NAT pre ťažký traffic
Implementácia
S3 Gateway Endpoint
# terraform/vpc_endpoints.tf
# S3 Gateway Endpoint (ZADARMO)
resource "aws_vpc_endpoint" "s3" {
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.${var.region}.s3"
vpc_endpoint_type = "Gateway"
route_table_ids = [
aws_route_table.private_a.id,
aws_route_table.private_b.id,
aws_route_table.private_c.id,
]
tags = {
Name = "s3-gateway-endpoint"
}
}
# DynamoDB Gateway Endpoint (ZADARMO)
resource "aws_vpc_endpoint" "dynamodb" {
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.${var.region}.dynamodb"
vpc_endpoint_type = "Gateway"
route_table_ids = [
aws_route_table.private_a.id,
aws_route_table.private_b.id,
aws_route_table.private_c.id,
]
tags = {
Name = "dynamodb-gateway-endpoint"
}
}
ECR Interface Endpoints
# ECR potrebuje DVA endpointy: api a dkr
resource "aws_vpc_endpoint" "ecr_api" {
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.${var.region}.ecr.api"
vpc_endpoint_type = "Interface"
subnet_ids = aws_subnet.private[*].id
security_group_ids = [aws_security_group.vpc_endpoints.id]
private_dns_enabled = true
tags = {
Name = "ecr-api-endpoint"
}
}
resource "aws_vpc_endpoint" "ecr_dkr" {
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.${var.region}.ecr.dkr"
vpc_endpoint_type = "Interface"
subnet_ids = aws_subnet.private[*].id
security_group_ids = [aws_security_group.vpc_endpoints.id]
private_dns_enabled = true
tags = {
Name = "ecr-dkr-endpoint"
}
}
# ECR tiež potrebuje S3 endpoint pre image layers!
# (Už vytvorený vyššie)
# Security group pre interface endpointy
resource "aws_security_group" "vpc_endpoints" {
name = "vpc-endpoints"
description = "Security group pre VPC endpointy"
vpc_id = aws_vpc.main.id
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = [aws_vpc.main.cidr_block]
}
tags = {
Name = "vpc-endpoints-sg"
}
}
Bežné Endpointy pre EKS
# Kompletný EKS-optimalizovaný endpoint setup
locals {
interface_endpoints = [
"ecr.api",
"ecr.dkr",
"logs", # CloudWatch Logs
"monitoring", # CloudWatch Metrics
"sts", # STS pre IAM roles
"ssm", # Systems Manager
"ssmmessages", # Session Manager
"ec2messages", # EC2 správy
"autoscaling", # Auto Scaling
"elasticloadbalancing", # ALB/NLB
]
}
resource "aws_vpc_endpoint" "interface_endpoints" {
for_each = toset(local.interface_endpoints)
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.${var.region}.${each.value}"
vpc_endpoint_type = "Interface"
subnet_ids = aws_subnet.private[*].id
security_group_ids = [aws_security_group.vpc_endpoints.id]
private_dns_enabled = true
tags = {
Name = "${each.value}-endpoint"
}
}
Porovnanie Nákladov
Real-World Scenár
EKS cluster s 50 nodmi:
- 100TB/mesiac S3 traffic (logy, artefakty, zálohy)
- 10TB/mesiac ECR pulls
- 5TB/mesiac DynamoDB
- 2TB/mesiac CloudWatch Logs
BEZ VPC Endpoints (všetko cez NAT):
┌─────────────────────────────────────────────────────────┐
│ Služba │ Traffic │ NAT Cost │ Mesačne │
├─────────────────────────────────────────────────────────┤
│ S3 │ 100 TB │ $0.045/GB │ $4,500 │
│ ECR │ 10 TB │ $0.045/GB │ $450 │
│ DynamoDB │ 5 TB │ $0.045/GB │ $225 │
│ CloudWatch │ 2 TB │ $0.045/GB │ $90 │
│ NAT hodinovo │ 3 AZs │ $0.045/hr │ $97 │
├─────────────────────────────────────────────────────────┤
│ CELKOM │ │ │ $5,362/mesiac│
└─────────────────────────────────────────────────────────┘
S VPC Endpoints:
┌─────────────────────────────────────────────────────────┐
│ Služba │ Traffic │ Endpoint Cost│ Mesačne │
├─────────────────────────────────────────────────────────┤
│ S3 (Gateway) │ 100 TB │ ZADARMO │ $0 │
│ DynamoDB (GW) │ 5 TB │ ZADARMO │ $0 │
│ ECR (Interface)│ 10 TB │ $0.01/GB │ $100 │
│ CloudWatch (IF)│ 2 TB │ $0.01/GB │ $20 │
│ Endpoint hodin │ 10 eps │ $0.01/hr×3AZ │ $216 │
│ NAT (znížené) │ ext only │ $0.045/hr │ $32 │
├─────────────────────────────────────────────────────────┤
│ CELKOM │ │ │ $368/mesiac │
└─────────────────────────────────────────────────────────┘
Mesačná úspora: $4,994
Ročná úspora: $59,928
Verifikácia
Skontroluj Cestu Traffic
# Z EC2 inštancie v privátnom subnete
# Pred endpointom: traffic ide cez NAT (verejná IP)
curl -s http://169.254.169.254/latest/meta-data/public-ipv4
# Vráti verejnú IP NAT Gateway
# Test S3 konektivity
aws s3 ls s3://my-bucket --debug 2>&1 | grep "endpoint"
# Hľadaj: "Endpoint: s3.us-east-1.amazonaws.com"
# Po S3 Gateway Endpoint
traceroute s3.us-east-1.amazonaws.com
# Malo by ukázať interný AWS routing, žiadny NAT hop
Over Použitie Endpointu
# Skontroluj VPC Flow Logs pre endpoint traffic
# Gateway endpointy: traffic zostáva v rámci VPC
# Interface endpointy: traffic ide na endpoint ENI
# CloudWatch Insights query
fields @timestamp, srcAddr, dstAddr, dstPort, bytes
| filter dstPort = 443
| filter srcAddr like /^10\./
| stats sum(bytes) as totalBytes by dstAddr
| sort totalBytes desc
| limit 20
Bežné Chyby
1. S3 Cross-Region Prístup
# Gateway endpoint funguje len pre ROVNAKÝ región
# Cross-region S3 prístup stále ide cez NAT alebo internet
# Riešenie: Použi S3 Transfer Acceleration alebo replikuj do rovnakého regiónu
# Alebo akceptuj NAT cost pre cross-region (zvyčajne malý traffic)
2. Chýbajúci ECR Layer Endpoint
ECR pull vyžaduje TRI endpointy:
1. ecr.api - ECR API volania
2. ecr.dkr - Docker registry protokol
3. s3 - Image layers uložené v S3!
Chýbajúci S3 endpoint = ECR pulls zlyhajú alebo idú cez NAT
3. Private DNS Nepovolené
# Interface endpoint s private_dns_enabled = false
# Znamená že service URL neresolvuje na endpoint
# Musíš použiť endpoint-špecifické DNS:
# vpce-xxx.ecr.us-east-1.vpce.amazonaws.com
# Lepšie: Povoľ private DNS
private_dns_enabled = true
# Teraz ecr.us-east-1.amazonaws.com resolvuje na endpoint ENI
4. Security Group Blokuje
# Interface endpointy potrebujú HTTPS (443) z VPC CIDR
resource "aws_security_group" "vpc_endpoints" {
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = [aws_vpc.main.cidr_block] # Celé VPC
}
}
Monitoring
CloudWatch Metriky
# VPC Endpoint metriky
aws cloudwatch get-metric-statistics \
--namespace AWS/PrivateLinkEndpoints \
--metric-name BytesProcessed \
--dimensions Name=VpcEndpointId,Value=vpce-xxx \
--start-time 2024-01-01T00:00:00Z \
--end-time 2024-01-31T23:59:59Z \
--period 86400 \
--statistics Sum
Cost Explorer
Filter podľa:
Service: EC2 - Other
Usage Type: DataTransfer-Regional-Bytes
Zoskup podľa: Operation
Hľadaj:
- NatGateway-Bytes (malo by klesnúť)
- VPCEndpoint-Bytes (nová kategória)
Checklist
## VPC Endpoints Cost Optimalizácia
### Bezplatné Gateway Endpointy (Priorita 1)
- [ ] Vytvor S3 Gateway Endpoint
- [ ] Vytvor DynamoDB Gateway Endpoint
- [ ] Pridaj do všetkých privátnych route tables
- [ ] Over že S3 traffic obchádza NAT
### High-Traffic Interface Endpointy (Priorita 2)
- [ ] ECR endpointy (api + dkr)
- [ ] CloudWatch Logs endpoint
- [ ] Secrets Manager (ak používané)
- [ ] Povoľ private DNS
### Verifikácia
- [ ] Skontroluj NAT Gateway data processing (malo by klesnúť)
- [ ] Over že ECR pulls fungujú z privátnych subnetov
- [ ] Testuj S3 prístup z privátnych subnetov
### Monitoring
- [ ] Sleduj endpoint BytesProcessed
- [ ] Porovnaj NAT costs pred/po
- [ ] Alert na endpoint chyby
Záver
Prestaň platiť za bezplatný AWS traffic:
- S3 a DynamoDB Gateway Endpointy sú ZADARMO
- Interface Endpointy sú lacnejšie ako NAT pre ťažký traffic
- ECR potrebuje tri endpointy (api, dkr, s3)
- $50k+/rok úspora je bežná pre stredné clustery
Skontroluj svoje NAT Gateway náklady dnes. Pravdepodobne preplácaš.
Súvisiace články
- Kubernetes Cross-Zone Traffic - Ďalšia AWS cost optimalizácia
- Redis Memory Fragmentácia - Resource optimalizácia
Súvisiace články
Kubernetes Cross-Zone Traffic: Skrytý Náklad Ktorý Žerie Váš Cloud Bill
Váš AWS účet má $5000/mesiac za data transfer. Polovica je cross-zone traffic v rámci clustera. Ukážem ako ho zmerať a znížiť.
S3 Intelligent-Tiering: Pasca Malých Objektov
S3 Intelligent-Tiering šetrí peniaze pre veľké súbory ale účtuje minimum 128KB overhead. Pre milióny malých objektov ZVYŠUJE náklady. Ukážem matematiku.
HTTP Keep-Alive Connection Reset: Prečo Vaše Requesty Zlyhávajú s 'Connection Reset by Peer'
Sporadické 'connection reset by peer' chyby v produkcii. Ukážem ako nesúlad keep-alive timeoutov medzi klientom a serverom toto spôsobuje a ako to opraviť.
Kubernetes conntrack Vyčerpanie: Tichý Zabijak Paketov
Náhodné DNS timeouty, dropped spojenia, služby timeout-ujú. Vaša nf_conntrack tabuľka je plná. Ukážem ako diagnostikovať, monitorovať a opraviť tento K8s networking problém.
Citujte tento článok
Ak na článok odkazujete, pridajte pôvodnú URL a uveďte autora.