EC2に割り当てたセキュリティグループの数を一斉に出力するPythonスクリプト作ってみた

こんにちは、臼田です。

皆さんLambdaしていますか?

今回は残念ながらLambdaには落とし込めていませんが、ちょっとしたスクリプトを書いたので共有したいと思います。

セキュリティグループが何個割り当てられているか確認したい

こんな課題はありませんか?

セキュリティグループは1つのEC2インスタンス(正確にはENI)につきデフォルトで5つまでしか割り当てられません。

役割ごとセキュリティグループを区切り過ぎるとうっかり上限に達していたり、ギリギリになっていたりします。

しかし、マネジメントコンソールからはぱっと見て各インスタンスの割当数は確認できません。

というわけで、それをダンプするスクリプトを書きました。

スクリプト

# -*- coding: utf-8 -*-

import argparse
import boto3

# Usage: python get-sg-count.py (get all instances sg count)
#        python get-sg-count.py i-xxxxxxxx i-yyyyyyyyy (get select instances sg count)

# load instance list
parser = argparse.ArgumentParser()
parser.add_argument('instances', help='instance_id', nargs='*')
args = parser.parse_args()

ec2 = boto3.resource('ec2')

if len(args.instances) == 0:
	# get instance_ids if no args
	instance_iterator = ec2.instances.all()
	instances = map(lambda x:x.id, instance_iterator)
else:
	instances = args.instances

for i in instances:
	instance = ec2.Instance(i)
	sgcount = len(instance.security_groups)
	t = instance.tags
	name_tag = filter(lambda x:x['Key']=='Name', t)
	name = name_tag[0]['Value'] if len(name_tag) > 0 else ''
	# dump [count: instance_id: Name_tag]
	print(': '.join([str(sgcount), i, name]))

実行結果

$ python get-sg-count.py
1: i-xxxxx667: server01
3: i-xxxxxd35: server02
1: i-xxxxxca4: server03
3: i-xxxxxce0: server04
2: i-xxxxx520: server05
4: i-xxxxx586: server06
4: i-xxxxxc49: server07
1: i-xxxxx059: server08
3: i-xxxxxdb3: server09
2: i-xxxxx6db: server10
1: i-xxxxxe3b: server11
4: i-xxxxxce4: server12
3: i-xxxxxd37: server13
3: i-xxxxxdb1: server14
$ python get-sg-count.py i-xxxxxca4 i-xxxxxce0 i-xxxxx520 i-xxxxx586 i-xxxxxc49
1: i-xxxxxca4: server03
3: i-xxxxxce0: server04
2: i-xxxxx520: server05
4: i-xxxxx586: server06
4: i-xxxxxc49: server07

引数を指定しないと全てのインスタンスについて実行し、確認したいインスタンスが決まっている場合にはそれだけ引数で指定することができます。

応用として、4つ以上割り当てられていたら表示するように条件を追加してあげてもいいかもしれませんね。

まとめ

マネジメントコンソールで一個一個確認することは煩雑で、対象が多くなるほどやりたくないですよね。

ちょっとした事でもスクリプトにして、今後も少しでもワークハックしていきたいです。