はじめに
AWSで開発をしていると、いつの間にか大量のセキュリティグループが出来てしまっていることってありませんか?
新規でリソースを作る際に「一旦検証だからいいや」とかの理由で既存のセキュリティグループを選択せず、同じような設定のものが増殖していくアレです。
開発が落ち着いたタイミングでいざリソース整理をする際にどれを使っていて、どれを使っていないのかがコンソールからはパッと見てわからないのでawsコマンドとシェルスクリプトを使った抽出方法を紹介します。
環境
- macOS Monterey
- MacBook Pro
- チップ Apple M1 Pro
- メモリ 32GB
前提
- aws コマンドインストールされていること
抽出方法についての考え方
冒頭にも書きましたがセキュリティグループはどのリソースにアタッチしているのかがコンソールからはわかりません。
しかし、使用しているセキュリティグループは基本的に1つ以上のENI(ネットワークインターフェース)と関連付きます。
つまり、セキュリティグループの一覧とENIの一覧を照らし合わせることで、削除しても良いセキュリティグループを洗い出すということです。
やってみよう
スクリプトの中身は以下の通りです。
セキュリティグループに関連付いているENIがあればTRUE、そうでなければFALSEを書きます。
#!/bin/bash
echo "sg_id,sg_name,result"
for sg in `aws ec2 describe-security-groups --query 'SecurityGroups[].[join(\`,\`,[GroupId,GroupName])]' --output text --region ap-northeast-1 --profile default`; do
sg_id=$(echo ${sg} | cut -d ',' -f1)
# セキュリティグループIDを使ってENIがあるかを確認します
eni=$(aws ec2 describe-network-interfaces --filters Name=group-id,Values=${sg_id} --query 'NetworkInterfaces[]' --output text --region ap-northeast-1 --profile default)
if [ -n "${eni}" ]; then
echo "${sg},true"
else
echo "${sg},false"
fi
done
実行時にsh [ファイル名].sh > [ファイル名].csv
などすればCSVとして出力されます。
注意点
このスクリプトからセキュリティグループの使用有無を判断できるのは起動中のリソースに関連付いているものとなります。
よって、AutoScalingGroupの起動設定に含まれるものや、ECSのタスク定義で瞬発的に稼働するものについては検知できません。
まとめ
AWSを使っていると、いつの間にか使わなくなったリソースが増えてしまい整理に追われることはあると思います。
請求書やコストエクスプローラーを見れば使っていないリソースを確認し削除することはできますが、細々としたものはなかなか判断ができなかったりします。セキュリティグループの整理に困っている人がいれば是非試してみてください。