2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS VPC Subnet内の未使用IPアドレスをリストアップするPythonスクリプト

Last updated at Posted at 2022-03-15

やりたいこと

サブネット内で未使用の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

やっていること

  1. DescribeSubnetsで指定サブネットのCIDRを取得
  2. DescribeNetworkInterfacesで指定サブネットのNetworkInterfaceで使用しているプライベートIPアドレスを取得=使用中IP
  3. 未使用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)は確認することができます。
将来的には今回出力した内容も見れるようになるかも!と期待しています。

Amazon_VPC_IP_Address_Manager_Console.png

ではまた

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?