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

如何使用ResourceGroupsTaggingAPI获取AWS所有区域带指定标签的资源ARN

跨AWS区域查询资源标签的解决方法

你当前返回结果不全是因为Resource Groups Tagging API是区域级服务,每个客户端默认只会请求初始化时指定的区域(未显式指定则使用本地配置的默认区域),仅能返回该区域内的匹配资源。要获取全区域的匹配ARN,只需遍历所有账号已启用的区域,为每个区域单独创建API客户端发起请求即可。

代码修改方案

核心修改逻辑如下:

  • 新增获取账号全量已启用区域的逻辑,无需硬编码区域列表,自动适配账号实际开通的区域
  • 外层新增区域遍历逻辑,每个区域单独初始化Tagging API客户端执行查询
  • 全局资源(IAM、CloudFront、Route53等)的标签默认存储在us-east-1区域,遍历过程会自动覆盖,无需额外处理

修改后可运行代码:

import boto3
import csv

class TagEditor:
    
    def writeToCsv(self,writer, tag_list):
        for resource in tag_list:
            for tag in resource['Tags']:
                row = dict(
                    ResourceArn=resource['ResourceARN'], TagKey=tag['Key'], TagValue=tag['Value'])
                writer.writerow(row)
            
    def query_region_tags(self, restag, writer):
        # 过滤tag1
        response_deployment = restag.get_resources(TagFilters=[{'Key':'tag1'}],ResourcesPerPage=100)
        self.writeToCsv(writer, response_deployment['ResourceTagMappingList'])
        
        while 'PaginationToken' in response_deployment and response_deployment['PaginationToken']:
            token = response_deployment['PaginationToken']
            response_deployment = restag.get_resources(TagFilters=[{'Key':'tag1'}], ResourcesPerPage=100, PaginationToken=token)
            self.writeToCsv(writer, response_deployment['ResourceTagMappingList'])

        # 过滤tag2
        response_deployment = restag.get_resources(TagFilters=[{'Key':'tag2'}],ResourcesPerPage=100)
        self.writeToCsv(writer, response_deployment['ResourceTagMappingList'])
        
        while 'PaginationToken' in response_deployment and response_deployment['PaginationToken']:
            token = response_deployment['PaginationToken']
            response_deployment = restag.get_resources(TagFilters=[{'Key':'tag2'}], ResourcesPerPage=100, PaginationToken=token)
            self.writeToCsv(writer, response_deployment['ResourceTagMappingList'])
    
    def main(self):
        field_names = ['ResourceArn', 'TagKey', 'TagValue']
        s3 = boto3.client('s3')
        # 获取账号下所有已启用的区域
        ec2 = boto3.client('ec2', region_name='us-east-1')
        regions = [region['RegionName'] for region in ec2.describe_regions()['Regions']]
        
        with open('/tmp/tags.csv', 'w') as csvfile:
            writer = csv.DictWriter(csvfile, quoting=csv.QUOTE_ALL,
                                    delimiter=',', dialect='excel', fieldnames=field_names)
            writer.writeheader()
            
            # 遍历每个区域执行查询
            for region in regions:
                print(f"正在查询区域:{region}")
                try:
                    restag = boto3.client('resourcegroupstaggingapi', region_name=region)
                    self.query_region_tags(restag, writer)
                except Exception as e:
                    print(f"区域{region}查询失败:{str(e)}")
                    continue
        
        s3.upload_file('/tmp/tags.csv', Bucket = 'my-bucket', Key = 'tags.csv')

注意事项

  • 请确保你使用的IAM身份(访问密钥/角色)具备所有区域的tag:GetResources权限,以及目标存储桶的s3:PutObject权限
  • 如果不需要遍历所有区域,可自行在获取到的regions列表中过滤所需查询的区域
  • ResourcesPerPage参数最高支持设置为100,可根据实际场景调整

内容的提问来源于stack exchange,提问作者Omega

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:36:04