Artifact Registry pricing (GCP): storage + downloads + egress (practical estimate)
Start with a calculator if you need a first-pass estimate, then use this guide to validate the assumptions and catch the billing traps.
Registries are "store bits, move bits". A reliable estimate separates three drivers: storage (GB-month), downloads (pull GB), and egress. Most surprises come from retention drift and peak pull storms (CI spikes, autoscaling, node churn).
0) Define your scope (what you are counting)
- Artifact types: containers vs language packages vs build artifacts (sizes and churn differ).
- Environments: prod/stage/dev repos (retention policies often drift by env).
- Regions: multi-region clusters and cross-region runners change egress patterns.
1) Storage (GB-month)
Build storage from retention. Start with "how much do we keep" rather than "how much do we push".
Tool: Storage cost (GB-month).
- Estimate average stored GB across the month, not just today's size.
- For container images, layer sharing means storage is often less than "tags × size" (validate with actual usage).
- Keep separate lines for base images vs app images (churn differs).
2) Downloads (pull volume)
Downloads scale with CI/CD and autoscaling. A good first model is: deploys/day × pulls per deploy × avg artifact size, plus a peak line for incident windows and node churn.
- CI peaks: parallel builds and retries can create short pull storms.
- Node churn: new nodes pull many images at once (worst during incidents).
- Caching: node-local caching and image pre-pulling can reduce download volume dramatically.
3) Egress (split by destination)
Treat transfer as its own line item. Split by destination because pricing and billing boundaries differ.
Tools: Data egress cost, Cross-region transfer.
- Same-region: often cheapest; keep clusters and registries co-located if possible.
- Cross-region: multi-region clusters and remote runners can make this meaningful.
- Internet: external users and third-party runners are the common egress driver.
Worked estimate template (copy/paste)
- Stored GB-month = average stored GB across month (validate with registry usage)
- Download GB/month = pulls/month × avg artifact size (baseline + peak)
- Egress GB/month = subset of downloads billed as outbound (cross-region/internet)
Common pitfalls
- Retention drift: old tags and layers kept forever.
- Assuming tags × size equals storage (layer sharing changes the math).
- Ignoring CI and scale-out peaks (pull storms are the peak scenario).
- Cross-region pulls hidden inside "it’s internal" assumptions.
- Not validating caching behavior (warm vs cold nodes).
How to validate
- Validate actual stored usage and retention settings per repo.
- Sample pull volume during peak build/deploy windows and scale-outs.
- Validate which destinations are billed as outbound (same-region vs cross-region vs internet).