Δες πόσο όντως κοστίζει το NAT Gateway στο eu-central-1 τη στιγμή που γράφουμε:
$0,045 / ώρα ≈ $32,40 / μήνα, ανά gateway
$0,045 / GB σε κάθε byte που επεξεργάζεται
Ένα gateway, idle, για έναν χρόνο: ~$390. Εντάξει, αυτό είναι ασήμαντο. Το ωριαίο πάγιο είναι στρογγύλεμα.
Το πρόβλημα είναι το per-GB. Η AWS σε χρεώνει $0,045 ανά GB που επεξεργάζεται σε κάθε κατεύθυνση, πάνω από τις χρεώσεις data-transfer-out προς το internet. Αν τα private-subnet workloads σου τραβάνε 5 TB/μήνα από container images σε public ECR, npm packages, OS updates, S3 objects σε άλλο region, ή — πιο συχνά — S3 objects στο ίδιο region μέσω του public S3 endpoint, αυτά είναι άλλα $225/μήνα ανά gateway μόνο και μόνο για να μεταφέρει bytes που είχες ήδη δωρεάν διαδρομή.
Πολλαπλασίασε με 3 AZs × 4 environments και ο φόρος ανεβαίνει γρήγορα.
Ο μεγάλος κακός: το S3 πάνω από το public endpoint
Η μεγαλύτερη γραμμή κόστους που βλέπουμε, account μετά από account, είναι private workloads που διαβάζουν από το S3 μέσω του public endpoint. Η κίνηση μένει εντός AWS, αλλά επειδή πάει σε public IP, περνάει από το NAT Gateway σου και πληρώνεις $0,045/GB για το προνόμιο.
Η λύση είναι δωρεάν, υπάρχει από το 2015, και τα περισσότερα accounts ακόμα δεν τη χρησιμοποιούν: VPC gateway endpoints για S3 και DynamoDB. Δεν κοστίζουν τίποτα. Δρομολογούν την κίνηση πάνω στο private backbone της AWS. Είναι δέκα γραμμές Terraform.
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[*].id
}
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[*].id
}
Apply. Η S3 κίνηση παρακάμπτει τελείως το NAT Gateway και η AWS συνεχίζει να μη σε χρεώνει για το endpoint. Έχουμε δει αυτή τη μία αλλαγή να κόβει NAT bills κατά 60–80% σε data-heavy workloads.
Το audit query
Πριν βελτιστοποιήσεις οτιδήποτε, δες τι επεξεργάζονται όντως τα gateways σου. Τράβα τις τελευταίες 30 μέρες από το CloudWatch:
aws cloudwatch get-metric-statistics \
--namespace AWS/NATGateway \
--metric-name BytesOutToDestination \
--dimensions Name=NatGatewayId,Value=nat-0abc123 \
--start-time "$(date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%S)" \
--end-time "$(date -u +%Y-%m-%dT%H:%M:%S)" \
--period 86400 \
--statistics Sum
Άθροισέ το, διαίρεσε με 1e9 για GB, πολλαπλασίασε επί 0,045 × 2 (in + out) — αυτό είναι το μηνιαίο σου κόστος από το συγκεκριμένο gateway. Οτιδήποτε πάνω από μερικές εκατοντάδες GB/day αξίζει μια ματιά.
Για το «τι περνάει όντως μέσα από αυτό», VPC Flow Logs είναι η μόνη ειλικρινής απάντηση. Ενεργοποίησέ τα, στείλ’ τα σε S3 + Athena, και τρέξε:
SELECT
dstaddr,
SUM(bytes) / 1e9 AS gb_out
FROM vpc_flow_logs
WHERE srcaddr LIKE '10.%'
AND dstaddr NOT LIKE '10.%'
AND day >= date_add('day', -7, current_date)
GROUP BY dstaddr
ORDER BY gb_out DESC
LIMIT 20;
Οι top 20 προορισμοί σου λένε τι ακριβώς να διορθώσεις. S3 IPs (κοίτα το prefix list com.amazonaws.global.s3) → πρόσθεσε gateway endpoint. ECR Public → πέρνα σε private ECR με interface endpoint. Container registries σε Docker Hub → mirror στο ECR.
Πότε ένα NAT ανά AZ είναι υπερβολή
Η reference architecture της AWS λέει: ένα NAT Gateway ανά AZ, για HA. Για τα περισσότερα non-prod environments και αρκετά low-traffic prods, αυτό είναι υπερβολή — και τριπλασιάζει το πάγιο κόστος για failure modes που θα τα άντεχες.
Για dev και staging, ένα κοινό NAT Gateway είναι συνήθως μια χαρά. Αν το AZ που ζει μέσα πέσει, το dev environment χάνει egress για μια ώρα. Σύγκρινέ το με 3 × $32 × 12 = $1.150/έτος ανά environment, για πάντα.
Για production, ο υπολογισμός εξαρτάται από το τι σημαίνει για σένα «egress πεσμένο σε ένα AZ». Αν το workload σου εξυπηρετεί κυρίως requests (egress = OS updates και metric pushes), επιβιώνεις σε single-NAT outage. Αν είναι ETL που τραβάει από εξωτερικά APIs, δεν επιβιώνεις.
Η διέξοδος του IPv6
Το NAT Gateway υπάρχει επειδή οι IPv4 διευθύνσεις είναι σπάνιες. Workloads που τρέχουν IPv6 δεν το χρειάζονται — χρησιμοποιούν egress-only Internet Gateway, που δεν έχει ούτε ωριαίο πάγιο ούτε per-GB χρέωση.
Το να πας IPv6-first είναι μεγαλύτερη απόφαση αρχιτεκτονικής απ’ ό,τι χωράει το post, αλλά αν ξεκινάς greenfield το 2026 αξίζει να το σκεφτείς σοβαρά. Η AWS έχει σταδιακά αναπτύξει IPv6 σε όλα τα services· τα περισσότερα managed AWS services και το Kubernetes (με amazon-vpc-cni σε IPv6 mode) το υποστηρίζουν πλέον.
Το checklist των πέντε λεπτών
- Πρόσθεσε S3 + DynamoDB gateway endpoints σε κάθε VPC. Δωρεάν, χωρίς ρίσκο, δέκα γραμμές.
- Δες NAT bytes 30 ημερών ανά gateway. Οτιδήποτε > 1 TB/μήνα αξίζει flow-log έρευνα.
- Για ECR-heavy workloads (CI runners, k8s nodes) πρόσθεσε ECR interface endpoint.
- Συγχώνευσε το non-prod NAT σε ένα κοινό gateway ανά environment.
- Mirror Docker Hub / public package registries σε private ECR με image cache.
NatGateway-Bytes. Αν αυτή η γραμμή ξεπερνά το 5% του μηνιαίου AWS λογαριασμού σου, έχεις τουλάχιστον ένα από τα παραπάνω και η λύση είναι ένα απόγευμα δουλειάς.
Κάνουμε σύντομα AWS cost audits — συνήθως 1–2 εβδομάδες, με σταθερό scope. Αν η γραμμή του NAT σε ανησυχεί, πες μας.