You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 20:21:38