Späť na blog

$10k/Mesiac AWS Chyba: NAT Gateway vs VPC Endpoints

|
| aws, cost-optimization, networking, vpc, nat-gateway, cloud

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:

  1. S3 a DynamoDB Gateway Endpointy sú ZADARMO
  2. Interface Endpointy sú lacnejšie ako NAT pre ťažký traffic
  3. ECR potrebuje tri endpointy (api, dkr, s3)
  4. $50k+/rok úspora je bežná pre stredné clustery

Skontroluj svoje NAT Gateway náklady dnes. Pravdepodobne preplácaš.


Súvisiace články

Súvisiace články

Citujte tento článok

Ak na článok odkazujete, pridajte pôvodnú URL a uveďte autora.

Michal Drozd. "$10k/Mesiac AWS Chyba: NAT Gateway vs VPC Endpoints". https://www.michal-drozd.com/sk/blog/aws-nat-gateway-vs-vpc-endpoints/ (Publikované 1. júla 2025).