2013-12-08 21 views
6

我在过去几周创建了新的EC2现货请求。每个请求都会创建一个新的安全组。当现货请求被删除时,安全组不会被删除。我已经达到了100组限制,并且想要删除它们。 EC2接口显然每次只允许删除一次,这意味着我必须点击300次才能删除这些组。还是有更好的方法来删除几个点击或代码行的多个安全组?如何删除Amazon ec2上的所有安全组?

回答

1

我想你可以通过组合一个列出所有安全组的命令和一个删除它们的命令来完成此操作。

如果您正在使用Python boto API(举例来说)这将是:

import boto 
conn = boto.connect_ec2(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) 
groups = conn.get_all_security_groups() 

它返回(作为一个例子):[SecurityGroup:appserver, SecurityGroup:default, SecurityGroup:vnc, SecurityGroup:webserver]

然后你将它们全部删除:

for group in groups: 
    conn.delete_security_group(group.split(":")[1]) 

编辑

您应该在shell上运行这些命令。

+1

试过您的解决方案,但目前的情况下不能访问旧的安全组,只有两个是上市,一个是使用和默认的一个。我不能这样做,因为使用安全组的实例已在几天前终止。目前的实例只有一个新的安全组运行(我从我的错误中学到)。显然,我将不得不点击300次。如果我选择多个安全组,EC2 UI将禁用删除按钮。不管怎么说,还是要谢谢你。 – Casady

+0

@Casady“我不能这样做,因为使用安全组的实例已经在几天前终止了。”我并不真正在你的云中,但我无法理解这意味着什么。纠正我,如果我错了,但我认为'get_all_security_groups'获取所有安全组。 :)你也应该尝试@slayedbylucifer的回答。 –

+0

我也这么认为!但是我登录了其中一个实例,运行python scrypt,它只显示两个。为实例创建的一个,以及默认的一个。 – Casady

4

这需要一些基本的脚本和AWS SDK。您可以使用AWS提供的几乎所有SDK来完成此任务。

我宁愿AWS-CLI,因为我已经安装和配置它。这是我会做什么:

  1. 列出所有describe-security-groups
  2. 的的SG安装jq(JSON的解析器BASH)
  3. 拉SG标识(检查thisjq语法)
  4. 一旦你拥有SG ID,请通过使用for循环运行delete-security-group

这是相当简单和直接的方式做你想要做的扫管笏。这可以通过任何AWS开发工具包完成。

这些只是一对夫妇的命令,它可以构建成一个bash脚本,提供:

  1. 你有aws-cli安装和配置
  2. 你已经安装在系统上jq

如果你已经安装了一些其他的AWS SDK,那么你最好用java/python/ruby​​等等,都有自己内置的解析JSON/HASH/DataStructure的方法。

希望这会有所帮助。

0

这些解决方案仅适用于您在其他安全组中引用相关安全组的规则。我有几个脚本会删除单个安全组,包括其他安全组中的入口规则。我还处理引用AWS ELB默认安全组的入口规则的特例。如果您遇到这种更复杂的情况,由于这些其他规则,上述解决方案不会删除您的安全组。我的脚本是在这里(一个用于EC2-经典和一个基于VPC安全组):https://gist.github.com/arpcefxl/2acd7d873b95dbebcd42

0
private static void delete(List<String> sgs) { 
    AmazonEC2Client ec2 = new AmazonEC2Client(Credentials.getCredentialsProvider()); 
    ec2.setEndpoint("ec2.us-west-2.amazonaws.com"); // default 

    for(String sg:sgs) { 
     System.out.println("DELETING SECURITY GROUP " + sg); 
     DeleteSecurityGroupRequest delReq = new DeleteSecurityGroupRequest().withGroupName(sg); 
     try { 
      ec2.deleteSecurityGroup(delReq); 
     } catch (Exception e) { 
      // e.printStackTrace(); 
     } 
    } 
}