【问题标题】:How to delete all security groups on Amazon ec2?如何删除 Amazon ec2 上的所有安全组?
【发布时间】:2016-01-15 16:10:12
【问题描述】:

我在过去几周创建了新的 EC2 现场请求。为每个请求创建了一个新的安全组。当现场请求被删除时,安全组没有被删除。我已经达到了 100 个组的限制并想删除它们。 EC2 界面显然一次只允许删除一个,这意味着我必须单击 300 次才能删除这些组。或者有没有更好的方法来通过几次点击或几行代码删除多个安全组?

【问题讨论】:

    标签: amazon-ec2


    【解决方案1】:

    这需要一些基本的脚本和 AWS 开发工具包。您可以使用 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 开发工具包来完成。

    这些只是可以构建到 Bash 脚本中的几个命令,前提是:

    1. 您已安装并配置了aws-cli
    2. 您的系统上安装了jq

    如果您已经安装了其他一些 AWS SDK,那么您最好使用它,因为 java/python/ruby...等都有自己的内置解析 JSON/HASH/DataStructure 的方式。

    希望这会有所帮助。

    【讨论】:

    • 不是这么简单的。安全组经常相互引用,所以这行不通。
    【解决方案2】:

    我认为您可以通过组合一个列出所有安全组的命令和另一个删除它们的命令来做到这一点。

    如果您使用的是 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 “我不能这样做,因为使用安全组的实例已在几天前终止”我并不真正在您的云中,但我不明白这意味着什么。如果我错了,请纠正我,但我认为get_all_security_groups 获取所有安全组。 :) 你也应该试试@slayedbylucifer 的回答。
    • 我也是这么想的!但是我已经登录到其中一个实例,运行 python scrypt,它只显示两个。为实例创建的,默认的。
    • @Casady 你不应该从一个实例中做它:) 在你的 shell 和你的电脑上做它,它会工作的。
    • 在我自己的电脑上使用这个 scrypt:gist.github.com/miketheman/2630437 放入我自己的密钥并在本地电脑上运行它。我得到这个输出: root@ubuntu:~/ec2/2630437# ./security-group-cleanup.py: [u'default', u'nv1'] - 所以仍然只显示 2 个组,但确实存在 98 个在我的 ec2 控制面板中。要删除的安全组列表如下。使用--delete 再次运行此命令以删除它们 [u'default', u'nv1'] 总共 2 个要删除的组。
    【解决方案3】:

    仅当您在其他安全组中没有引用相关安全组的规则时,这些解决方案才有效。我有几个脚本可以删除单个安全组,包括其他安全组中的入口规则。我还处理引用 AWS ELB 默认安全组的入口规则的特殊情况。如果您遇到这种更复杂的情况,上述解决方案不会因为这些其他规则而删除您的安全组。我的脚本在这里(一个用于 ec2-classic,一个用于基于 VPC 的安全组):https://gist.github.com/arpcefxl/2acd7d873b95dbebcd42

    【讨论】:

      【解决方案4】:
      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();
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-05-26
        • 2023-03-12
        • 2015-01-11
        • 1970-01-01
        • 1970-01-01
        • 2014-09-01
        • 2016-03-16
        • 1970-01-01
        • 2021-03-28
        相关资源
        最近更新 更多