【问题标题】:How to calculate total ip's of a subnet in AWS如何计算 AWS 中子网的总 IP
【发布时间】:2019-03-25 01:02:10
【问题描述】:

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

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

请分享执行此操作的 boto3 命令。

【问题讨论】:

  • 您可以将 python 脚本与 os.system 和“aws ec2 describe-network-interfaces --filters SubnetId=subnet-b61f49f0 | grep PublicIp | wc -l”一起使用,然后将输出与预先确定的数字进行比较然后使用 python smtp 模块或 SES 触发电子邮件。
  • 预定义的数字是多少?我不想硬编码任何数字。我需要提取总数。另外,是否像 ENI 总 IP + 可用 IP 地址计数(describe_subnets)给出了子网的总 IP?
  • 通过上面的命令,你得到使用的公共IP,首先你可能需要单独存储或通过另一个命令提取总ip,这里是预先定义的数字,然后比较两者,这样你就可以得到总ip使用量.
  • 子网掩码决定了一个子网中IP地址的数量,但保留地址减去5。例如,/24 子网将有 256 - 5 = 251 可用地址。

标签: amazon-web-services subnet


【解决方案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

【讨论】:

  • 感谢您的更新。看起来不错,但卡在一个点上。我有一个 CIDR 为 10.97.32.0/21 的子网,它产生 2048 个 IP ..(忽略 5)它将四舍五入为 2043 个 IP。但是在网络接口部分,我可以看到子网下共有 1,697 个,子网部分中的总可用 IP4 为 245。大约有 101 个 IP 缺失。是否像总子网 IP = ENI IP + 可用 IP + 保留 IP (5)?如果是这样,它不匹配。
  • 您是否有机会识别未在该子网的网络接口列表中列出的不可用 IP?想知道正在运行的某些类别的托管 AWS 资源是否未出现在该列表中。除了 EC2,你在那个子网中运行什么?
  • 我正在刷新子网页面和 ENI 页面。可能是由于某些指标刷新,计数未正确捕获。我通过 lambda 调用了所有内容并且工作正常。
  • 是的贾莫德。你的建议对我有帮助。
猜你喜欢
  • 2021-05-22
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 2011-01-19
  • 2012-12-02
  • 2012-10-06
  • 2012-12-28
  • 1970-01-01
相关资源
最近更新 更多