惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
GbyAI
GbyAI
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 叶小钗
U
Unit 42
Engineering at Meta
Engineering at Meta
aimingoo的专栏
aimingoo的专栏
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
Vercel News
Vercel News
美团技术团队
雷峰网
雷峰网
Recent Announcements
Recent Announcements
有赞技术团队
有赞技术团队
D
DataBreaches.Net
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Apple Machine Learning Research
Apple Machine Learning Research
J
Java Code Geeks
罗磊的独立博客
MyScale Blog
MyScale Blog
博客园_首页
IT之家
IT之家
F
Fortinet All Blogs
博客园 - Franky

Hacker News: Show HN

PurrrrrFocus: Pomodoro Timer App - App Store Workflow Engine — Multi-Step Orchestration for Bun RapidPhoto: Pro Photo Editor App - App Store GitHub - DheerG/swarms: Achieve extraordinary results with claude code across a variety of tasks SPICE simulation → oscilloscope → verification with Claude Code — Lucas Gerads Show HN: VCoding – A 5 MB native Windows IDE with no dynamic dependencies Show HN: LLMs don't hallucinate because they're bad at math, it's the format GitHub - Agent-FM/agentfm-core: AgentFM is a peer-to-peer network that turns everyday computers into a decentralized AI supercomputer. AgentFM lets you run massive AI workloads directly across a global mesh of idle CPUs and GPUs. Show HN: Tracking Top US Science Olympiad Alumni over Last 25 Years GitHub - Potarix/agent-hub: One place to talk to all your agents Show HN: Runtime security for AI agents(injection,tool abuse, data exfiltration) GitHub - dubeyKartikay/lazyspotify: Terminal Spotify client for macOS and Linux GitHub - the-banana-tool/king-louie: Easy to use GUI Personal AI Assistant. Win/Linux/Mac. Show HN I made my vacation rental bookable by AI agents–no Airbnb, 0% commission GitHub - basteez/jsf-autoreload: maven plugin to enable hot reload on jsf projects uvm32/hosts/host-gdbstub at main · ringtailsoftware/uvm32 GitHub - labsai/EDDI: Config-driven engine that turns JSON into production-grade AI agents. Multi-agent orchestration, 12+ LLM providers, MCP/A2A protocols, RAG, persistent memory, and enterprise compliance (EU AI Act, GDPR, HIPAA). Built on Quarkus. GitHub - glitchnsec/fortyone-oss: AI Executive Assistant Platform Quickstart | Alien GitHub - muxshed/shed: One stream in, or many. Every destination, simultaneously. No cloud middleman, no per-channel fees, no limits. GitHub - ocrbase-hq/ocrbase: 📄 PDF/IMG ->.MD/JSON Document OCR API for PaddleOCR and GLMOCR. Self-hostable. GitHub - impactjo/home-memory: MCP server that lets your AI assistant remember everything about your home. GitHub - Sets88/dbcls: DbCls is a powerful terminal database client that supports various databases GitHub - neptun2000/heor-agent-mcp GitHub - SeanFDZ/macmind: Single-layer transformer in HyperTalk for the classic Macintosh RollQuation: Math Puzzles - Apps on Google Play GitHub - dropbox/witchcraft Show HN: Agent-cache – Multi-tier LLM/tool/session caching for Valkey and Redis GitHub - opentalon/opentalon: OpenTalon is an open-source platform built from the ground up in Go as a robust alternative to OpenClaw LinkedIn™ 职位抓取工具 - Chrome 应用商店
We open sourced nat-zero: scale-to-zero NAT instances for...
leonardosul · 2026-04-28 · via Hacker News: Show HN

nat-zero is a Terraform module that replaces always-on NAT infrastructure with on-demand NAT instances that start when your workloads need internet access and shut down when they don't. We built it because we're cheap and our workloads are weird.

Today we're open sourcing it.

The problem

At machine.dev we run GPU workloads across every availability zone in six AWS regions. The workloads live in private subnets — no public IPs, no direct internet access. They need NAT to reach the outside world for things like pulling packages and container images.

Our workloads are sporadic. We have an Intelligent Tiering system that hunts for the cheapest GPU globally, or within whatever regions the user has defined. Some AZs might not see a single job for days. Then suddenly they see fifty.

AWS gives you two standard options for NAT and neither of them made sense for us:

NAT Gateway costs about $36/month per AZ. We operate in every AZ across six regions. That's a lot of AZs, and most of them are sitting empty most of the time. The per-GB data processing charge on top of that would have eaten us alive. NAT Gateway is built for steady-state traffic. Our traffic is the opposite of steady-state.

Always-on NAT instances (like fck-nat, which is genuinely good) run about $7-8/month per AZ. Better, but we were too tight-fisted to pay for instances running 24/7 in AZs that had zero workloads. Paying for a NAT instance to sit idle in ap-southeast-2b for four days straight because nobody needed a GPU in Sydney this week felt like the kind of waste that keeps you up at night. It did keep me up at night.

We needed a third option: NAT that scales to zero when nothing is running, starts up when something is, and costs almost nothing in between.

So we built one.

How nat-zero works

The core idea is simple: a single Lambda function watches for EC2 instance state changes via EventBridge. When a workload launches in a private subnet, the Lambda starts a NAT instance in that AZ. When the last workload terminates, it stops the NAT and releases the Elastic IP.

The interesting part is how it makes decisions. The Lambda runs a reconciliation loop — it doesn't care what event triggered it. It just looks at the current state of the AZ and takes one corrective action:

Workloads? NAT State EIP? Action
YesNoneCreate NAT
YesStoppedStart NAT
YesRunningNo EIPAllocate and attach EIP
YesRunningHas EIPConverged. Do nothing.
NoRunningStop NAT
NoStoppedHas EIPRelease EIP
NoStoppedNo EIPConverged. Do nothing.

One action per invocation, then it returns. The next event triggers the next step. This keeps the logic dead simple and avoids the kind of race conditions that make infrastructure code age you prematurely.

The Lambda runs at concurrency of one. This is deliberate. One writer means no duplicate NAT creation, no double EIP allocation, no start/stop races, and no need for distributed locking. Events that arrive while it's running just queue up. Simple beats clever every time.

The dual ENI trick

Each NAT instance uses two network interfaces — one private, one public — both pre-created by Terraform. When the NAT instance stops and starts, the ENIs stick around. This means your route tables stay pointed at the right place and you don't have to reconfigure anything on restart. The EIP attaches to the public ENI when the NAT is running and gets released when it stops, so you're not paying the $3.60/month public IPv4 charge on idle AZs.

This is the part that makes the scale-to-zero part actually work without breaking your routing. It's a nice bit of engineering that we're quietly proud of, despite being the kind of people who normally downplay everything.

What it costs

Here's the part we actually care about:

State nat-zero fck-nat NAT Gateway
Idle (no workloads)~$0.80/month~$7-8/month~$36+/month
Active (workloads running)~$7-8/month~$7-8/month~$36+/month

That $0.80 idle cost is just the EBS volume sitting there waiting. No instance running, no EIP allocated, no meter ticking. When a workload shows up, you're paying the same as a regular fck-nat instance. When it leaves, you're back to pocket change.

We run across 22 AZs. NAT Gateway would have cost us $792/month. With nat-zero, idle months cost us $17.60. That's the kind of difference that turns your AWS bill from "we need to have a meeting about this" into "that seems fine."

How fast is it

The honest answer: about 10 seconds for a cold start. A NAT instance that's completely new takes roughly 10.7 seconds from workload launch to internet connectivity. Restarting a stopped NAT is about 8.5 seconds. If the NAT is already running, it's instant.

For us this was fine. Our workloads are resilient to a brief wait for network access. The GPU instances themselves need time to initialize anyway — the NAT instances actually started faster than the workloads did, so in practice nobody was ever waiting for NAT. The 10-second cold start is a number we measured carefully and never actually experienced as a real delay.

The Lambda itself is a compiled Go binary running on ARM64. Cold start is 55ms. Typical invocation is 400-600ms. Peak memory is 29MB out of 128MB allocated. It's fast because it does very little per invocation, which is the whole point.

Why open source

Same reason as everything else we open source: it's useful, and keeping it to ourselves doesn't make it more useful. We built nat-zero to solve a real problem we had. Other people running sporadic workloads in private subnets have the same problem. The module is self-contained, well-tested (integration tests run against real AWS infrastructure on every PR), and MIT licensed.

If your workloads are bursty, spread across multiple AZs, or just not running often enough to justify always-on NAT, this might save you some money. If your workloads are steady-state and high-throughput, NAT Gateway is probably still the right call. We're not pretending this is the right solution for everyone. We're saying it was the right solution for us, and it might be for you too.

Try it

The repo is at github.com/MachineDotDev/nat-zero and the docs are at nat-zero.machine.dev. It's a Terraform module — point it at your VPC, tell it which AZs and subnets to manage, and it handles the rest.

If you find a bug, open an issue. If you find a way to make it cheaper, we definitely want to hear about it.