Python set.difference校验AWS标签时输出全量结果而非仅不合规资源
脚本错误原因
你的代码存在3个核心逻辑/缩进错误,导致全量输出资源、标签校验结果不准:
mandatory_tags_list强制标签列表被错误缩进在单标签遍历循环for key_value_pair in resource['Tags']内部,每次遍历单个标签都会重复声明该列表,属于无效冗余代码,还存在作用域异常风险- 差集计算、计数、打印结果的整段逻辑,缩进层级错误,跑到了单资源遍历循环
for resource in page['ResourceTagMappingList']的外部,会导致遍历完当前页所有资源后,仅拿最后一个资源的标签做计算,前面的资源完全没被校验 - 没有增加不合规判断分支:未判断差集结果是否为空,不管资源有没有缺失标签都会直接打印,合规资源自然也会被输出
- 额外冗余:存在一行无任何作用的悬空语句
tags_list,以及未被使用的key_value变量赋值,可以直接删除
修正后代码
import boto3 import json def extract_tags(): # 强制标签列表移到循环外,单次定义即可 mandatory_tags = { "phx.tfe_workspace", "aws.region", "phx.bounded_context", "phx.owner", "phx.service_tier" } session = boto3.Session(profile_name='dev-apps-read-only') client = session.client('resourcegroupstaggingapi', region_name='ap-southeast-1') paginator = client.get_paginator('get_resources') for page in paginator.paginate(): for resource in page['ResourceTagMappingList']: resource_arn = resource['ResourceARN'] # 直接提取当前资源所有标签键转集合 resource_tag_keys = {tag['Key'] for tag in resource['Tags']} # 计算缺失的强制标签 missing_tags = mandatory_tags.difference(resource_tag_keys) # 仅当存在缺失标签(不合规)时才输出 if missing_tags: matched_tag_count = len(mandatory_tags & resource_tag_keys) print(json.dumps(f'resource ARN: {resource_arn}')) print(json.dumps(f"('Non-Compliant Tags:', {missing_tags})", indent=2)) print(matched_tag_count) extract_tags()
修正点说明
- 强制标签直接初始化为set类型,移到循环最外层,避免循环内重复做类型转换、重复声明列表
- 调整所有校验、打印逻辑的缩进,放到单资源遍历循环内部,保证每个资源独立完成标签校验
- 增加
if missing_tags:判断分支,差集为空(即所有强制标签都存在的合规资源)直接跳过,仅输出不合规资源 - 用集合推导式直接提取标签键,删掉冗余的临时列表、无用变量和无意义悬空语句,简化逻辑
内容的提问来源于stack exchange,提问作者Moe
相关产品推荐
相关产品推荐

