如何使用boto3获取AWS安全组规则的Description并筛选无描述规则的安全组
解决方法
boto3可以直接通过安全组规则查询接口获取规则的描述字段,你可以按以下步骤实现筛选逻辑:
- 首先初始化AWS EC2客户端,确保你的凭证拥有
ec2:DescribeSecurityGroups和ec2:DescribeSecurityGroupRules权限 - 调用
describe_security_group_rules接口拉取所有安全组规则,判断每条规则是否存在Description字段、且字段值非空 - 收集所有包含无描述规则的安全组ID,可进一步关联查询安全组绑定的EC2实例信息
示例代码
import boto3 # 初始化EC2客户端,替换为你实际使用的区域 ec2 = boto3.client('ec2', region_name='cn-north-1') # 拉取所有安全组规则 sg_rules_resp = ec2.describe_security_group_rules() # 存储包含无描述规则的安全组ID(自动去重) bad_sg_ids = set() for rule in sg_rules_resp['SecurityGroupRules']: # 判断规则是否未填写描述 if 'Description' not in rule or not rule['Description'].strip(): bad_sg_ids.add(rule['GroupId']) # 输出符合条件的安全组 print("包含无描述规则的安全组ID列表:") for sg_id in bad_sg_ids: print(sg_id) # 如需进一步查询绑定了这些安全组的EC2实例,可添加以下逻辑 if bad_sg_ids: instances_resp = ec2.describe_instances( Filters=[ { 'Name': 'instance.group-id', 'Values': list(bad_sg_ids) } ] ) bind_instances = [] for reservation in instances_resp['Reservations']: bind_instances.extend(reservation['Instances']) print("\n绑定上述安全组的EC2实例ID列表:") for ins in bind_instances: print(ins['InstanceId'])
如果你使用老版本boto3走describe_security_groups接口查询,规则描述字段会散落在IpPermissions下每个权限条目的IpRanges、Ipv6Ranges、UserIdGroupPairs子字段中,每个IP段/对端安全组对应单独的描述,遍历逻辑更繁琐,推荐优先用describe_security_group_rules接口实现。
内容的提问来源于stack exchange,提问作者DrewM
相关产品推荐
相关产品推荐

