如何在AWS中计算子网的总IP

时间:2019-03-24 04:51:54

标签: amazon-web-services subnet

最近,由于ENI占用了大量IP,VPC中出现了IP用尽的问题。我需要在boto3中编写一个脚本,以在总IP使用量增加约80%左右时触发警报。

因此,我需要知道VPC中子网中分配的IP总数。我需要使用的IP和免费IP的总数。

请分享执行该命令的boto3命令。

1 个答案:

答案 0 :(得分:1)

awscli ec2 describe-subnets调用实际上将返回您子网中未使用的专用IPv4地址的数量。任何停止的实例的IPv4地址都被视为不可用。

例如:

aws ec2 describe-subnets \
    --subnet-ids subnet-c0c1a23a \
    --query "Subnets[0].AvailableIpAddressCount"

示例输出:

249

要计算子网10.0.0.0/24或更常用的/ N中可用IP的总数:

10.0.0.0/24 => 2**(32-24) - 5
10.0.0.0/N  => 2**(32-N) - 5

请注意,您减去5是因为每个子网CIDR块中的前四个IP地址和最后一个IP地址均为reserved by 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