AWSの利用していないセキュリティグループの調査方法
利用してないAWSのセキュリティグループを削除することをしたので、やったことをまとめようと思います。
AWSのセキュリティグループの利用方法には、大きく分けて2種類あります。
- ENIに恒常的に利用されるタイプ
- ENIに一時的に利用されるタイプ
ENI(Elastic Network Interface)は、AWSで利用されている仮想ネットワークカードです。EC2やRDSインスタンスを立ち上げて、セキュリティグループを紐づける利用方法は、"ENIに恒常的に利用されるタイプ"です。このタイプの利用では、該当するセキュリティグループを削除しようとすると、"ENIに紐づいて利用されてます"というエラーメッセージが表示されるので、利用されているに気付くことが出来ます。
一方、"ENIに一時的に利用されるタイプ"の場合は、普段はどのENIにも紐づいてないので、一見削除して大丈夫そうに見えますが、一時的に利用されている可能性があるので慎重になる必要があります。気をつけないと、昼間に削除したセキュリティグループが、実は深夜のLambda関数実行の際に利用されていて、バッチ処理でエラーになったという事故を起こすかもしれません。
AWSのリソースによって、"ENIに恒常的に利用されるタイプ"と"ENIに一時的に利用されるタイプ"のどちらのケースで利用されているか把握しておく必要があります。
- ENIに恒常的に利用されるタイプのリソース
- EC2
- ELB
- RDS
- ElastiCache など
- ENIに一時的に利用されるタイプのリソース
- Lambda
- Launch Template など
"ENIに恒常的に利用されるタイプ"は、"ENIに一時的に利用されるタイプ"と比べればセキュリティグループとENIの対応を調べるのが楽です。
以下は、https://cloudarchitect.net/articles/159を参考にした、セキュリティグループと、ENIの対応関係にInbound/Outboundルール情報をCSVで出力するpythonスクリプトです。スクリプトの実行には、boto3パッケージが必要なので事前にpipでインストールしてください。(pip install json boto3) 実行結果をファイルにリダイレクトして書き出せばCSVファイルを作成できます。(python sg_eni_rules.py > result.csv)ExcelやGoogleのSpreadsheetでこのファイルを開けば、Security GroupとENIの対応関係が一覧でわかります。
セキュリティグループが、"ENIに恒常的に利用されるタイプ"のリソースしか利用していないのであれば、これで調査は終わりです。ENIに紐づいていないセキュリティグループを削除すれば大丈夫です。しかし、"ENIに一時的に利用されるタイプ"のリソースも利用している可能性がある場合は、さらに調査が必要です。
"ENIに一時的に利用されるタイプ"のリソースは、常にセキュリティグループとENIが紐づけている訳ではないので、リソース毎にセキュリティグループの設定をみて判断する必要があります。
以下のコマンドは、そのリソースで設定されているセキュリティグループのGroup IDを一覧で表示させます。(jqコマンドを利用しているので、インストールしていない場合は、事前にbrew install jqでインストールが必要。)
Lambda
aws lambda list-functions | jq .Functions[].VpcConfig.SecurityGroupIds | grep sg | sort
Launch Template
lt_ids=$(aws ec2 describe-launch-templates | jq -r .LaunchTemplates[].LaunchTemplateId) for lt_id in ${lt_ids[@]} do aws ec2 describe-launch-template-versions --launch-template-id ${lt_id} | jq .LaunchTemplateVersions[].LaunchTemplateData.SecurityGroupIds[] done | sort | uniq
このように、"ENIに一時的に利用されるタイプ"の場合は、リソース毎に設定がないか確認する必要があります。自分の場合は、LambdaとLaunch Templateのリソースがこのタイプに当てはまったのですが、利用しているAWSリソースが多い人は、他にも"ENIに一時的に利用されるタイプ"に当てはまるリソースを利用しているかもしれません。
以上、まとめると、
- まず、"ENIに恒常的に利用されるタイプ"のリソースから、ENIと紐づかないセキュリティグループを洗い出す
- 洗い出されたセキュリティグループは、"ENIに一時的に利用されるタイプ"のリソースで利用されてないか確認する
という流れになります。この2タイプの両方で利用されていないセキュリティグループは、削除可能なものとなります。