やりたいこと
サブネット内で未使用のIPアドレス(IPv4)をリストアップしたい。
社内で「EKS使っていると、セカンダリIPとかでランダムにIP消費されるので、各ENIで使用しているIPを愚直に確認するのはしんどい」という声があり、一発でうまいこと出せる機能がなさそうだったのでスクリプトを書きました。
ちなみに今回の対象はIP Address Manager プールから作成していないVPCでした。
スクリプト
書いたスクリプトをGitHubにあげています。よかったら使ってください。
使うには以下が必要です
- Python3.8以上
- boto3
- AWSの権限
- ec2:DescribeSubnets
- ec2:DescribeNetworkInterfaces
Pythonバージョンについて
print出力のときf-string使いたかったので「Python3.8以上」で書きましたが、"".format()の方式に変更すればPython3.3あれば使えると思います。
使い方
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_DEFAULT_PROFILE=my_aws_account
python describe_unused_ips.py subnet-000000000000
output
subnet_id='subnet-000000000000' mode='normal'
cidr='10.1.0.0/24'
cidr_ips=['10.1.0.0', '10.1.0.1', '10.1.0.2', '10.1.0.3', '10.1.0.4', ...]
-----------
reserved_ips=['10.1.0.0', '10.1.0.1', '10.1.0.2', '10.1.0.3', '10.1.0.255']
-----------
used_ips=['10.1.0.39']
-----------
unused_ips=['10.1.0.4', '10.1.0.5', '10.1.0.6', ...]
-----------
cidr=10.1.0.0/24 cidr_ips=256 reserved=5 used=1 unused=250
数が多いのでここでは ... で省略していますが、実際は対象の全IP出力します。
改行モード
python describe_unused_ips.py subnet-000000000000 lb
lbってつけると改行して表示します
subnet_id='subnet-0775762f52d4a3bd4' mode='lb'
cidr='10.1.0.0/24'
cidr_ips=
10.1.0.0
10.1.0.1
10.1.0.2
10.1.0.3
10.1.0.4
...
-----------
reserved_ips=
10.1.0.0
10.1.0.1
10.1.0.2
10.1.0.3
10.1.0.255
-----------
used_ips=
10.1.0.39
-----------
unused_ips=
10.1.0.4
10.1.0.5
10.1.0.6
...
-----------
cidr=10.1.0.0/24 cidr_ips=256 reserved=5 used=1 unused=250
やっていること
- DescribeSubnetsで指定サブネットのCIDRを取得
- DescribeNetworkInterfacesで指定サブネットのNetworkInterfaceで使用しているプライベートIPアドレスを取得=使用中IP
- 未使用IPアドレス = サブネットのCIDR範囲のIPアドレス - 使用中IPアドレス - 予約IPアドレス
CIDR範囲内のIPアドレスをリストアップするのはipaddressという標準ライブラリ使っています ipaddress.IPv4Network(cidr)
。
IPアドレスをソートするのにもipaddressを使ってます xxx_ips.sort(key=ipaddress.IPv4Address)
。
NetworkInterfaceからプライマリ,セカンダリ両方のアドレスを抽出するように「PrivateIpAddress」ではなく「PrivateIpAddresses」の配列からIPアドレスを取り出してます。
予約IPについては公式ドキュメント参照
各サブネット CIDR ブロックの最初の 4 つの IP アドレスと最後の IP アドレスは使用できず、インスタンスに割り当てることができません。例えば、CIDR ブロック 10.0.0.0/24 を持つサブネットの場合、次の 5 つの IP アドレスが予約されます。
終わりに
Amazon VPC IP Address Manager でPoolから生成していないsubnetも使用率(IP usage)は確認することができます。
将来的には今回出力した内容も見れるようになるかも!と期待しています。
ではまた