diff --git a/README.md b/README.md
index f905259..76be7d5 100644
--- a/README.md
+++ b/README.md
@@ -3,6 +3,8 @@
+`aws_region_ip_sizes.py` fetches AWS `ip-ranges.json`, collapses overlapping IPv4 CIDRs, and prints unique IP counts by region.
+
# [compute / memory unit prices by virtual machine type](https://instances.vantage.sh/)
diff --git a/aws_region_ip_sizes.py b/aws_region_ip_sizes.py
new file mode 100644
index 0000000..b05d4a7
--- /dev/null
+++ b/aws_region_ip_sizes.py
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+from collections import defaultdict
+from ipaddress import collapse_addresses, ip_network
+from json import load
+from urllib.request import urlopen
+
+
+AWS_IP_RANGES_URL = "https://ip-ranges.amazonaws.com/ip-ranges.json"
+
+
+def load_aws_prefixes(url=AWS_IP_RANGES_URL):
+ with urlopen(url) as response:
+ return load(response)["prefixes"]
+
+
+def unique_ipv4_counts_by_region(prefixes):
+ regions = defaultdict(list)
+ for prefix in prefixes:
+ if "ip_prefix" not in prefix:
+ continue
+ regions[prefix["region"]].append(ip_network(prefix["ip_prefix"]))
+
+ return {
+ region: sum(network.num_addresses for network in collapse_addresses(networks))
+ for region, networks in regions.items()
+ }
+
+
+def main():
+ counts = unique_ipv4_counts_by_region(load_aws_prefixes())
+ total = sum(counts.values())
+
+ for region, count in sorted(counts.items(), key=lambda item: item[1], reverse=True):
+ print(f"{region}: {count / total:.2%} ({count:,})")
+ print(f"total: {total // 1_000_000} million")
+
+
+if __name__ == "__main__":
+ main()