如何在Amazon ec2上删除所有安全组?

6

我在过去几周中创建了新的EC2 Spot请求。 每个请求都创建了一个新的安全组。 当删除Spot请求时,安全组没有被删除。 我已经达到了100个安全组的限制,并希望将它们删除。 EC2界面显然只允许一次删除一个安全组,这意味着我必须点击300次才能删除这些组。 或者,是否有更好的方法可以用少量点击或几行代码删除多个安全组?

4个回答

4
这需要一些基本的脚本编写和 AWS SDK。您可以使用 AWS 提供的几乎所有 SDK 来完成此操作。
我更喜欢使用 AWS-CLI,因为我已经安装并配置好了它。以下是我会做的:
1. 使用 describe-security-groups 列出所有 SG。 2. 安装 jq(BASH 的 Json 解析器)。 3. 拉取 SG ID(请参阅 this 获取 jq 语法)。 4. 一旦您拥有 SG ID,请使用 for 循环运行 delete-security-group
这是一种相当简单直接的方式来实现您想要做的事情。这可以通过任何 AWS SDK 完成。
这只是几个命令,可以组合成一个Bash脚本,前提是:
  1. 您已安装并配置了aws-cli
  2. 您的系统上已安装jq

如果您已经安装了其他AWS SDK,则最好使用它,因为Java/Python/Ruby等都有自己内置的解析JSON/HASH/DataStructure的方法。

希望这可以帮到您。


1
这并不简单。安全组经常相互引用,因此这样做行不通。 - rjurney

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
@Casady:“我不能这样做,因为使用安全组的实例已经在几天前被终止了。”我不在你的云中,但我不明白这是什么意思。如果我错了,请纠正我,但我认为get_all_security_groups会获取所有安全组。 :) 你也应该尝试一下@slayedbylucifer的答案。 - Artem Tsikiridis
我也是这么想的!但是我已经登录到其中一个实例中,运行了Python脚本,它只显示了两个。一个是为该实例创建的,另一个是默认的。 - Casady
@Casady,你不应该从实例中执行它 :) 在你的 shell 和电脑上执行,它会起作用。 - Artem Tsikiridis
使用此脚本在我的个人电脑上完成:https://gist.github.com/miketheman/2630437 放入自己的密钥并从本地计算机运行。我得到了以下输出: root@ubuntu:~/ec2/2630437# ./security-group-cleanup.py: [u'default', u'nv1'] -- 因此仍然只显示2个组,但是我的ec2控制面板中存在98个组。 要删除的安全组列表如下。 再次使用“--delete”运行以将它们删除 [u'default', u'nv1'] 共有2个组被选定用于删除。 - Casady

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();
        }
    }
}

0

这些解决方案只在您没有规则引用所涉及的安全组的“其他”安全组时才起作用。我有几个脚本,将删除单个安全组,包括其他安全组中的入站规则。我还处理了入站规则引用 AWS ELB 默认安全组的特殊情况。如果您有这种更复杂的情况,则上述解决方案不会删除您的安全组,因为存在其他规则。我的脚本在此处(一个针对经典 EC2 的,一个针对基于 VPC 的安全组):https://gist.github.com/arpcefxl/2acd7d873b95dbebcd42


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接