вызов awscli ec2 description-subnets фактически вернет вам количество неиспользованных частных адресов IPv4 в подсети. Адреса IPv4 для любых остановленных экземпляров считаются недоступными.
Например:
aws ec2 describe-subnets \
--subnet-ids subnet-c0c1a23a \
--query "Subnets[0].AvailableIpAddressCount"
Пример вывода:
249
Чтобы рассчитать общее количество используемых IP-адресов в подсети 10.0.0.0/24 или, более обычно, a / N:
10.0.0.0/24 => 2**(32-24) - 5
10.0.0.0/N => 2**(32-N) - 5
Обратите внимание, что вы вычитаете 5, потому что первые четыре IP-адреса и последний IP-адрес в каждом блоке CIDR подсети зарезервированы AWS и не могут быть назначены экземпляру.
И, на всякий случай, скрипт на Python:
import boto3
ec2 = boto3.resource('ec2')
# Use this for specific subnets
# filters = [{'Name':'subnet-id', 'Values':['subnet-c0c1a23a']}]
# subnets = ec2.subnets.filter(Filters=filters)
# Use this for all subnets
subnets = ec2.subnets.all()
for subnet in list(subnets):
free_ips = subnet.available_ip_address_count
n = int(subnet.cidr_block.split('/')[1])
cidr_ips = 2**(32-n)
used_ips = cidr_ips - free_ips
print('{:s}: cidr={:d}, aws used=5, you used={:d}, free={:d}'.\
format(subnet.id, cidr_ips, used_ips - 5, free_ips))
Пример вывода:
subnet-1eb2e345: cidr=256, free=251, aws used=5, you used=0
subnet-c0c1a23a: cidr=256, free=249, aws used=5, you used=2