やりたいこと

サブネット内で未使用のIPアドレス(IPv4)をリストアップしたい。

社内で「EKS使っていると、セカンダリIPとかでランダムにIP消費されるので、各ENIで使用しているIPを愚直に確認するのはしんどい」という声があり、一発でうまいこと出せる機能がなさそうだったのでスクリプトを書きました。

ちなみに今回の対象はIP Address Manager プールから作成していないVPCでした。

スクリプト

書いたスクリプトをGitHubにあげています。よかったら使ってください。

Python Script that describes Unused IPs for the specified Subnet - GitHub - shu85t/aws_describe_unused_ips: Python Script that describes Unused IPs for the specified Subnet

使うには以下が必要です

  • 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)は確認することができます。
将来的には今回出力した内容も見れるようになるかも!と期待しています。

ではまた

元記事はこちら

https://qiita.com/shu85t/items/01b6a9d6fa4ca39c0431
著者:@shu85t


アイレットなら、AWS で稼働するサーバーを対象とした監視・運用・保守における煩わしい作業をすべて一括して対応し、経験豊富なプロフェッショナルが最適なシステム環境を実現いたします。AWS プレミアコンサルティングパートナーであるアイレットに、ぜひお任せください。

AWS 運用・保守サービスページ:
https://cloudpack.jp/service/aws/maintenance.html

その他のサービスについてのお問合せ、お見積り依頼は下記フォームよりお気軽にご相談ください。
https://www.iret.co.jp/contact/service/form/