अप्रयुक्त अमेज़ॅन EC2 सुरक्षा समूहों को कैसे खोजें


93

मैं अनाथ सुरक्षा समूहों को निर्धारित करने का एक तरीका खोजने की कोशिश कर रहा हूं ताकि मैं उन्हें साफ कर सकूं और उनसे छुटकारा पा सकूं। क्या किसी को अप्रयुक्त सुरक्षा समूहों की खोज करने का तरीका पता है।

या तो कंसोल के माध्यम से या कमांड लाइन टूल के साथ काम करेगा (लिनक्स और ओएसएक्स मशीनों पर कमांड लाइन टूल चलाना)।


4
लंबे समय से निर्जीव वस्तुओं (आरडीएस, ईएलबी, एएलबी) के लिए अपवाद के बिना इस सवाल का पूरी तरह से जवाब देने वाला मेरा साम्राज्य, जो एसजीएस को उन्हें सौंपा जा सकता है, और इसमें 'सभी का चयन करें, फिर डरावना' सप्ताहांत शामिल न करें -destroyer दृष्टिकोण। :)
जेसी एडेलमैन

जवाबों:


78

नोट: यह केवल EC2 में सुरक्षा उपयोग पर विचार करता है, RDS जैसी अन्य सेवाओं के लिए नहीं। EC2 के बाहर उपयोग किए जाने वाले सुरक्षा समूहों को शामिल करने के लिए आपको अधिक कार्य करने की आवश्यकता होगी। अच्छी बात यह है कि आप सक्रिय सुरक्षा समूहों को हटाने के लिए आसानी से (संभव भी नहीं हो सकता है) यदि आप एक संबद्ध w / किसी अन्य सेवा को याद करते हैं।

नए AWS CLI टूल का उपयोग करते हुए, मुझे एक आसान तरीका मिला जो मुझे चाहिए:

सबसे पहले, सभी सुरक्षा समूहों की एक सूची प्राप्त करें

aws ec2 describe-security-groups --query 'SecurityGroups[*].GroupId'  --output text | tr '\t' '\n'

फिर, एक उदाहरण से बंधा सभी सुरक्षा समूहों मिलता तब तक पहुंचाया sortतो uniq:

aws ec2 describe-instances --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' --output text | tr '\t' '\n' | sort | uniq

फिर इसे एक साथ रखें और 2 सूचियों की तुलना करें और देखें कि मास्टर सूची से क्या उपयोग नहीं किया जा रहा है:

comm -23  <(aws ec2 describe-security-groups --query 'SecurityGroups[*].GroupId'  --output text | tr '\t' '\n'| sort) <(aws ec2 describe-instances --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' --output text | tr '\t' '\n' | sort | uniq)

1
@ एरिक हां, मेरे पास केवल एक ही क्षेत्र है और AWS लिपियों में उनका गृह क्षेत्र पर्यावरण चर के माध्यम से निर्धारित है। मुझे इस स्क्रिप्ट का एक बहु-क्षेत्र संस्करण देखने में दिलचस्पी होगी।
रे

1
आप अपने vpc के लिए --filter जोड़ना चाह सकते हैं ताकि आपको अन्य डिफ़ॉल्ट vpc sg
shadowbq

2
एक सुरक्षा समूह भी एक ईएलबी द्वारा उपयोग में हो सकता है। यह आदेश डिफ़ॉल्ट क्षेत्र में ELBs द्वारा संदर्भित सुरक्षा समूह IDs के uniq सेट को सूचीबद्ध करेगा:aws elb describe-load-balancers --query 'LoadBalancerDescriptions[*].SecurityGroups[*]' --output text | tr '\t' '\n' | sort | uniq
astletron

2
एक RDS उदाहरण द्वारा EC2 सुरक्षा समूह भी उपयोग में हो सकता है। यह कमांड डिफॉल्ट रीजन में RDS के aws rds describe-db-security-groups --query 'DBSecurityGroups[*].EC2SecurityGroups[*].EC2SecurityGroupId' --output text | tr '\t' '\n' | sort | uniq
इंस्ट्रूमेंट्स

2
आप aws ec2 describe-network-interfaces --query 'NetworkInterfaces[*].Groups[*].GroupId' --output text| tr '\t' '\n' | sort | uniqनेटवर्क इंटरफेस का वर्णन करने के लिए भी उपयोग कर सकते हैं ।
जोनाथन

63

यदि आप EC2 कंसोल में अपने सभी सुरक्षा समूहों का चयन करते हैं, तो कार्रवाई दबाएं -> सुरक्षा समूह हटाएं, एक पॉपअप आपको बताएगा कि आप ऐसे सुरक्षा समूहों को नहीं हटा सकते हैं जो इंस्टेंस, अन्य सुरक्षा समूहों या नेटवर्क इंटरफेस से जुड़े हैं, और यह उन सुरक्षा समूहों को सूचीबद्ध करेगा जिन्हें आप हटा सकते हैं; यानी अप्रयुक्त सुरक्षा समूह :)


15
जबकि मुझे सहमत होना चाहिए, "सिलेक्ट ऑल + डिलीट" का उपयोग करना आमतौर पर वास्तव में अच्छी आदत नहीं है।
बाल्मीपुर २०'१६ को १m:

3
यदि आप अनिश्चित हैं तो यह काम करेगा आप केवल एक डमी सुरक्षा समूह बना सकते हैं और इसे कुछ संलग्न कर सकते हैं, इसे हटाने का प्रयास कर सकते हैं और देख सकते हैं कि यह आपको नहीं होने देगा।
NLail

2
आपको वास्तव में डिलीट की पुष्टि करने की आवश्यकता नहीं है, पॉपअप में यह आपको ब्रेकडाउन दिखाएगा कि किन लोगों को हटाया जा सकता है (अनाथ) और जो नहीं कर सकते। फिर आप रद्द को दबा सकते हैं और फिर अनाथ लोगों को हटा सकते हैं।
rjarmstrong

4
जो मुझे नहीं मिलता वह यह है: यदि AWS कंसोल इस जानकारी की पेशकश कर सकता है जब आप यह डरावना करते हैं। यह, वे एपीआई के माध्यम से एक ही काम करने के लिए साझा क्यों नहीं करते हैं? ऐसा नहीं है कि यह कुछ ऐसा है जो भूरा क्षेत्र के वातावरण में आवश्यक है ...
जेसी एडेलमैन

1
बहादुर बनो :: यह करो
zanuka

29

यह सुरक्षा समूह को संबंधित उदाहरणों की संख्या के साथ सूचीबद्ध करने के लिए boto (Python SDK for AWS) में लिखा गया नमूना कोड है।

आप इस तर्क का उपयोग कमांड लाइन में भी कर सकते हैं

बोटो कोड

import boto
ec2 = boto.connect_ec2()
sgs = ec2.get_all_security_groups()
for sg in sgs:
    print sg.name, len(sg.instances())

उत्पादन

Security-Group-1 0
Security-Group-2 1
Security-Group-3 0
Security-Group-4 3

अच्छा और आसान! धन्यवाद
क्रिस Koston

6
अच्छी तरह से, हाँ, लेकिन क्या abou elbs?
इलजा

यह भी ध्यान दें कि इसमें केवल रनिंग इंस्टेंस शामिल हैं। आप एक एसजी को नहीं हटा सकते हैं जो एक रुकी हुई आवृत्ति से जुड़ा हुआ है।
AgDude

6
यह आरडीएस जैसी सेवाओं के इंटरफेस को नजरअंदाज करता है। RDS उदाहरण का मालिक है, लेकिन आप ENI के स्वामी हैं। मुझे लगता है कि ElasticSearch और ELB समान रूप से काम करते हैं और इस स्क्रिप्ट के साथ प्रदर्शित नहीं होंगे
रजत बनर्जी

6

लगभग एक वर्ष के बिना उपयोग के बाद, मुझे अपने AWS EC2 सुरक्षा समूहों का ऑडिट करना और विरासत, अप्रयुक्त समूहों को साफ करना आवश्यक लगा।

यह वेब GUI के माध्यम से प्रदर्शन करने के लिए एक चुनौतीपूर्ण काम था, इसलिए मैंने कार्य को आसान बनाने के लिए AWS CLI को देखा। मुझे StackOverflow में यह कैसे करना है पर एक शुरुआत मिली, लेकिन यह पूरी तरह से दूर था। इसलिए मैंने अपनी स्क्रिप्ट लिखने का फैसला किया। मैंने निम्नलिखित प्रदर्शन करने के लिए AWS CLI, MySQL और कुछ "बैश-फू" का उपयोग किया:

  1. सभी EC2 सुरक्षा समूहों की एक सूची प्राप्त करें। मैं समूह-आईडी, समूह-नाम और विवरण को एक MySQL डेटाबेस में "समूहों" नामक एक tabled में संग्रहीत करता हूं जिसे स्थानीयहोस्ट पर aws_security_groups कहा जाता है। पाए गए समूहों की कुल संख्या उपयोगकर्ता को बताई गई है।

  2. निम्न सेवाओं में से प्रत्येक से जुड़े सभी सुरक्षा समूहों की सूची प्राप्त करें और उन्हें तालिका से बाहर करें: EC2 Istances EC2 लोचदार भार Balancers AWS RDS उदाहरण AWS OpsWorks (प्रति अमेज़न नहीं हटाया जाना चाहिए) डिफ़ॉल्ट सुरक्षा समूह (हटाया नहीं जा सकता) ) इलास्टीचे

प्रत्येक सेवा के लिए मैं बहिष्करण पूरा होने के बाद तालिका में छोड़े गए समूहों की संख्या की गणना करता हूं।

  1. अंत में मैं समूह-आईडी, समूह-नाम और बचे हुए समूहों के लिए विवरण प्रदर्शित करता हूं। ये "अप्रयुक्त" समूह हैं जिन्हें ऑडिट करने और / या हटाने की आवश्यकता है। मैंने पाया है कि एसजी के उदाहरणों और इलास्टिक लोड बैलेंसर्स (ईएलबी) के बीच अक्सर एक दूसरे को संदर्भित करते हैं। क्रॉस संदर्भों को हटाने और सुरक्षा समूहों को हटाने से पहले वे वास्तव में उपयोग में नहीं हैं यह सुनिश्चित करने के लिए कुछ मैनुअल जांच करना सबसे अच्छा अभ्यास है। लेकिन मेरी स्क्रिप्ट कम से कम इसे कुछ प्रबंधनीय के बराबर कर देती है।

नोट: 1. आप अपने MySQL होस्ट, उपयोगकर्ता नाम और पासवर्ड को संग्रहीत करने के लिए एक फ़ाइल बनाना चाहेंगे और इसके लिए $ DBCONFIG चर को इंगित करेंगे। इसे इस तरह संरचित किया जाना चाहिए:

[mysql]
host=your-mysql-server-host.com
user=your-mysql-user
password=your-mysql-user-password
  1. आप चाहें तो डेटाबेस का नाम बदल सकते हैं - स्क्रिप्ट में $ DB चर को बदलना सुनिश्चित करें

मुझे पता है कि आप इस उपयोगी पाते हैं या कोई टिप्पणी, सुधार या संवर्द्धन है।

यहाँ स्क्रिप्ट है।

#!/bin/bash
# Initialize Variables
DBCONFIG="--defaults-file=mysql-defaults.cnf"
DB="aws_security_groups"
SGLOOP=0
EC2LOOP=0
ELBLOOP=0
RDSLOOP=0
DEFAULTLOOP=0
OPSLOOP=0
CACHELOOP=0
DEL_GROUP=""

# Function to report back # of rows
function Rows {
    ROWS=`echo "select count(*) from groups" | mysql $DBCONFIG --skip-column-names $DB`
#   echo -e "Excluding $1 Security Groups.\nGroups Left to audit: "$ROWS
    echo -e $ROWS" groups left after Excluding $1 Security Groups."
}


# Empty the table
echo -e "delete from groups where groupid is not null" | mysql $DBCONFIG $DB

# Get all Security Groups
aws ec2 describe-security-groups --query "SecurityGroups[*].[GroupId,GroupName,Description]" --output text > /tmp/security_group_audit.txt
while IFS=$'\t' read -r -a myArray
do
    if [ $SGLOOP -eq 0 ];
    then
        VALUES="(\""${myArray[0]}"\",\""${myArray[1]}"\",\""${myArray[2]}"\")"
    else
        VALUES=$VALUES",(\""${myArray[0]}"\",\""${myArray[1]}"\",\""${myArray[2]}"\")"
    fi
    let SGLOOP="$SGLOOP + 1"
done < /tmp/security_group_audit.txt
echo -e "insert into groups (groupid, groupname, description) values $VALUES" | mysql $DBCONFIG $DB
echo -e $SGLOOP" security groups total."


# Exclude Security Groups assigned to Instances
for groupId in `aws ec2 describe-instances --output json | jq -r ".Reservations[].Instances[].SecurityGroups[].GroupId" | sort | uniq`
do
    if [ $EC2LOOP -eq 0 ];
    then
        DEL_GROUP="'$groupId'"
    else
        DEL_GROUP=$DEL_GROUP",'$groupId'"
    fi
    let EC2LOOP="$EC2LOOP + 1"
done
echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
Rows "EC2 Instance"
DEL_GROUP=""


# Exclude groups assigned to Elastic Load Balancers
for elbGroupId in `aws elb describe-load-balancers --output json | jq -c -r ".LoadBalancerDescriptions[].SecurityGroups" | tr -d "\"[]\"" | sort | uniq`
do
    if [ $ELBLOOP -eq 0 ];
    then
        DEL_GROUP="'$elbGroupId'"
    else
        DEL_GROUP=$DEL_GROUP",'$elbGroupId'"
    fi
    let ELBLOOP="$ELBLOOP + 1"
done
    echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
Rows "Elastic Load Balancer"
DEL_GROUP=""


# Exclude groups assigned to RDS
for RdsGroupId in `aws rds describe-db-instances --output json | jq -c -r ".DBInstances[].VpcSecurityGroups[].VpcSecurityGroupId" | sort | uniq`
do
    if [ $RDSLOOP -eq 0 ];
    then
        DEL_GROUP="'$RdsGroupId'"
    else
        DEL_GROUP=$DEL_GROUP",'$RdsGroupId'"
    fi
    let RDSLOOP="$RDSLOOP + 1"
done
    echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
Rows "RDS Instances"
DEL_GROUP=""

# Exclude groups assigned to OpsWorks
for OpsGroupId in `echo -e "select groupid from groups where groupname like \"AWS-OpsWorks%\"" | mysql $DBCONFIG $DB`
do
    if [ $OPSLOOP -eq 0 ];
    then
        DEL_GROUP="'$OpsGroupId'"
    else
        DEL_GROUP=$DEL_GROUP",'$OpsGroupId'"
    fi
    let OPSLOOP="$OPSLOOP + 1"
done
echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
Rows "OpsWorks"
DEL_GROUP=""

# Exclude default groups (can't be deleted)
for DefaultGroupId in `echo -e "select groupid from groups where groupname like \"default%\"" | mysql $DBCONFIG $DB`
do
    if [ $DEFAULTLOOP -eq 0 ];
    then
        DEL_GROUP="'$DefaultGroupId'"
    else
        DEL_GROUP=$DEL_GROUP",'$DefaultGroupId'"
    fi
    let DEFAULTLOOP="$DEFAULTLOOP + 1"
done
echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
Rows "Default"
DEL_GROUP=""

# Exclude Elasticache groups
for CacheGroupId in `aws elasticache describe-cache-clusters --output json | jq -r ".CacheClusters[].SecurityGroups[].SecurityGroupId" | sort | uniq`
do
    if [ $CACHELOOP -eq 0 ];
    then
        DEL_GROUP="'$CacheGroupId'"
    else
        DEL_GROUP=$DEL_GROUP",'$CacheGroupId'"
    fi
    let CACHELOOP="$CACHELOOP + 1"
done
echo -e "delete from groups where groupid in ($DEL_GROUP)" | mysql $DBCONFIG $DB
Rows "ElastiCache"

# Display Security Groups left to audit / delete
echo "select * from groups order by groupid" | mysql $DBCONFIG $DB | sed 's/groupid\t/groupid\t\t/'

और यहाँ डेटाबेस बनाने के लिए sql है।

-- MySQL dump 10.13  Distrib 5.5.41, for debian-linux-gnu (x86_64)
--
-- Host:  localhost   Database: aws_security_groups
-- ------------------------------------------------------
-- Server version   5.5.40-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `groups`
--

DROP TABLE IF EXISTS `groups`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `groups` (
  `groupid` varchar(12) DEFAULT NULL,
  `groupname` varchar(200) DEFAULT NULL,
  `description` varchar(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `groups`
--

LOCK TABLES `groups` WRITE;
/*!40000 ALTER TABLE `groups` DISABLE KEYS */;
/*!40000 ALTER TABLE `groups` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2015-01-27 16:07:44

3

एक बोटो उदाहरण केवल उन सुरक्षा समूहों के समूह आईडी और नामों को मुद्रित करता है जिनका कोई वर्तमान उदाहरण नहीं है।

यह यह भी दर्शाता है कि आप किस क्षेत्र से संबंधित हैं, इसे कैसे निर्दिष्ट करें।

import boto
import boto.ec2
EC2_REGION='ap-southeast-2'
ec2region = boto.ec2.get_region(EC2_REGION)
ec2 = boto.connect_ec2(region=ec2region)
sgs = ec2.get_all_security_groups()
for sg in sgs:
    if len(sg.instances()) == 0:
        print ("{0}\t{1}".format(sg.id, sg.name))

यह पुष्टि करने के लिए कि कौन से सुरक्षा समूह अभी भी उपयोग किए जा रहे हैं, आपको if len(sg.instances()) == 0परीक्षण को उल्टा करना चाहिए या len(sg.instances())मान को प्रिंट करना चाहिए।

उदाहरण के लिए

print ("{0}\t{1}\t{2} instances".format(sg.id, sg.name, len(sg.instances())))

3

नोड्स एडब्ल्यूएस एसडीके का उपयोग करके मैं पुष्टि कर सकता हूं कि एडब्ल्यूएस आपको सुरक्षा समूहों को हटाने की अनुमति नहीं देता है जो उपयोग में हैं। मैंने एक स्क्रिप्ट लिखी है जो सभी समूहों को हटाने की कोशिश करती है और इनायत त्रुटियों को संभालती है। यह क्लासिक और आधुनिक वीपीसी के लिए काम करता है। त्रुटि संदेश नीचे देखा जा सकता है।

Err { [DependencyViolation: resource sg-12345678 has a dependent object]
  message: 'resource sg-12345678 has a dependent object',
  code: 'DependencyViolation',
  time: Mon Dec 07 2015 12:12:43 GMT-0500 (EST),
  statusCode: 400,
  retryable: false,
  retryDelay: 30 }


1

नेटवर्क इंटरफेस से जुड़े SGs तक:

नाम से:

aws ec2 describe-network-interfaces --output text --query NetworkInterfaces[*].Groups[*].GroupName | tr -d '\r' | tr "\t" "\n" | sort | uniq

आईडी द्वारा:

aws ec2 describe-network-interfaces --output text --query NetworkInterfaces[*].Groups[*].GroupId | tr -d '\r' | tr "\t" "\n" | sort | uniq

0

AWS बाज़ार में एक उपकरण है जो इसे बहुत आसान बनाता है। यह आपको दिखाता है कि आसान विलोपन के लिए कौन से समूह संलग्न / अलग हैं, लेकिन यह सुरक्षा समूह के नियमों के खिलाफ आपके VPC फ़्लो लॉग्स की तुलना भी करता है और आपको दिखाता है कि SG नियम उपयोग में हैं या अप्रयुक्त हैं। AWS ने ऐसा करने के लिए ELK-stack समाधान पोस्ट किया, लेकिन यह हास्यास्पद रूप से जटिल था।

यहाँ उपकरण, और एक अस्वीकरण है जो मैंने इस पर काम किया है। लेकिन मुझे आशा है कि आप सभी इसे प्रासंगिक पाएंगे: https://www.piasoftware.net/single-post/2018/04/24/VIDEO-Watch-as-we-clean-up-EC2-security-groups/in-just -कुछ मिनट


0

दुर्भाग्य से चुना गया उत्तर उतना सटीक नहीं है जितना मुझे ज़रूरत है (मैंने इसकी जांच करने की कोशिश क्यों की है, लेकिन मैंने इसे लागू करना पसंद किया है)।
अगर मैं सभी की जांच करता हूं NetworkInterfaces, तो किसी को अटैचमेंट की तलाश है SecurityGroup, यह मुझे आंशिक परिणाम देता है। यदि मैं केवल जांच करता हूं EC2Instances, तो इससे मुझे आंशिक परिणाम भी मिलते हैं।

तो यह समस्या के लिए मेरा दृष्टिकोण है:

  1. मुझे सभी EC2 SecurityGroups -> मिलते हैं all_secgrp
  2. मुझे सभी EC2 उदाहरण मिलते हैं -> all_instances
  3. प्रत्येक उदाहरण के लिए, मुझे इसके साथ सभी सुरक्षा समूह मिलते हैं
    1. मैं इनमें से प्रत्येक SecurityGroup (क्योंकि संलग्न है) से हटाता हूं
  4. प्रत्येक SecurityGroup के लिए, मैं किसी भी NetworkInterfaces ( filterफ़ंक्शन का उपयोग करके और उस का उपयोग करके फ़िल्टरिंग) के साथ एक एसोसिएशन की जांच करता हूंsecurity-group-id ) के
    1. यदि कोई सहयोग नहीं मिला है, तो मैं सुरक्षा-समूह को हटा देता हूं all_secgrp

संलग्न आप कोड का एक स्निपेट देख सकते हैं। दक्षता के लिए शिकायत न करें, लेकिन यदि आप चाहें तो इसे अनुकूलित करने का प्रयास करें।

all_secgrp = list(ec2_connector.security_groups.all())
all_instances = ec2_connector.instances.all()

for single_instance in all_instances:
    instance_secgrp = ec2_connector.Instance(single_instance.id).security_groups
    for single_sec_grp in instance_secgrp:
        if ec2.SecurityGroup(id=single_sec_grp['GroupId']) in all_secgrp:
            all_secgrp.remove(ec2.SecurityGroup(id=single_sec_grp['GroupId']))

all_secgrp_detached_tmp = all_secgrp[:]
for single_secgrp in all_secgrp_detached_tmp:
    try:
        print(single_secgrp.id)
        if len(list(ec2_connector.network_interfaces.filter(Filters=[{'Name': 'group-id', 'Values': [single_secgrp.id]}]))) > 0:
            all_secgrp.remove(single_secgrp)
    except Exception:
        all_secgrp.remove(single_secgrp)

return all_secgrp_detached  

0

यह एक कठिन समस्या है, यदि आपके पास सुरक्षा समूह हैं जो नियमों में अन्य सुरक्षा समूहों को संदर्भित करते हैं। यदि हां, तो आपको डिपेंडेंसी एरर्स को हल करना होगा, जो कि तुच्छ नहीं है।

यदि आप केवल IP पते का उपयोग कर रहे हैं, तो यह समाधान काम करेगा, जब आप boto3 क्लाइंट बनाते हैं:

# pull all security groups from all vpcs in the given profile and region and save as a set
all_sgs = {sg['GroupId'] for sg in client.describe_security_groups()['SecurityGroups']}

# create a new set for all of the security groups that are currently in use
in_use = set()

# cycle through the ENIs and add all found security groups to the in_use set
for eni in client.describe_network_interfaces()['NetworkInterfaces']:
    for group in eni['Groups']:
        in_use.add(group['GroupId'])

unused_security_groups = all_sgs - in_use

for security_group in unused_security_groups:
    try:
        response = client.delete_security_group(GroupId=security_group)
    except ClientError as e:
        if e.response['Error']['Code'] == 'DependencyViolation':
            print('EC2/Security Group Dependencies Exist')
    else:
        print('Unexpected error: {}'.format(e))

यह RDS द्वारा इस्तेमाल किए गए SGs को कवर नहीं करेगा
alexandernst
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.