AWS 安全组清理

AWS 安全组清理

我们拥有相当大的 EC2 资产,并且发现自己处于数百个安全组的情况。有没有人找到以下方法:

  • 列出未与实例关联的安全组
  • 导出每个安全组及其关联实例和规则

谢谢,亚历克斯

答案1

您无法删除与网络接口关联的安全组,即正在运行或已停止的实例。但是,如果您从 AMI 创建实例,并且当前没有引用安全组的实例或其他资源(如负载均衡器),则可能会删除它们。

最简单的做法是尝试删除所有安全组,不会删除与正在运行或停止的实例相关联的组。

如果您有自定义要求,您可以根据您想要编写的任何逻辑编写一个 lambda 来完成您需要做的事情。

答案2

玩一玩aws 命令行界面或者使用 python 的库博托3

对于 aws CLI,您可以使用以下命令将所有现有安全组及其规则转储到 json 中:描述安全组

aws ec2 describe-security-groups --output json
# sample output
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [], 
            "Description": "group desc", 
            "IpPermissions": [
                {
                    "PrefixListIds": [], 
                    "FromPort": 27004, 
                    "IpRanges": [], 
                    "ToPort": 27049, 
                    "IpProtocol": "tcp", 
                    "UserIdGroupPairs": [
                        {
                            "GroupName": "name", 
                            "UserId": "0511234123441", 
                            "GroupId": "sg-b0674836"
                        }

对于第二部分,你有描述实例子命令 whitch 将转储所有实例的描述,其中包括关联的安全组。您必须编写一个小程序来处理这些 json 输出,但交叉引用实例和组规则所需的所有数据都在那里。您甚至可以使用路径查询以清除 JSON 输出中不需要的数据。

aws ec2 describe-instances --query "Reservations[].Instances[].[InstanceId,SecurityGroups]" --output json

[
    [
        "i-0c7bbc88743583793", 
        [
            {
                "GroupName": "group1", 
                "GroupId": "sg-a3f77f1d4"
            }
        ]
    ], 
    [
        "i-0f4ab88f9f9853a", 
        [
            {
                "GroupName": "group2", 
                "GroupId": "sg-7e99434"
            }
        ]
    ], 

....

如果你选择 boto3 库,你会发现该库的输入和输出非常相似,都具有描述实例函数描述安全组功能

还请小心,因为如果您使用 EC2 Classic 安全组或 VPC 安全组,代码可能会有所变化,因为它们有点不同。

相关内容