Как получить ресурсы из ВСЕХ регионов с помощью ResourceGroupsTaggingAPI

0

Вопрос

Я пытаюсь загрузить все ARN с определенными тегами с помощью boto3 и ResourceGroupsTaggingAPI. Я фильтрую по двум тегам и получаю 8 разных ARN, когда я должен получить более 80 ARN.

**Редактировать:**Я понял, что это из-за ограничения API. Согласно документации, API позволяет извлекать теги из региона, который вы используете в данный момент. Есть ли какой-либо способ получить теги из ВСЕХ регионов?

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 main(self):
        
        field_names = ['ResourceArn', 'TagKey', 'TagValue']
        s3 = boto3.client('s3')
        restag = boto3.client('resourcegroupstaggingapi')
        
        
        with open('/tmp/tags.csv', 'w') as csvfile:
            writer = csv.DictWriter(csvfile, quoting=csv.QUOTE_ALL,
                                    delimiter=',', dialect='excel', fieldnames=field_names)
            writer.writeheader()
            
            # Filter for 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'])
    
            # Filter for 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'])
        
        s3.upload_file('/tmp/tags.csv', Bucket = 'my-bucket', Key = 'tags.csv')
1

Лучший ответ

0

Это связано с тем, что у вас были фильтры тегов при первом вызове и вы пропустили их при последующем вызове с разбивкой по страницам

Вызовы с разбиением на страницы должны включать один и тот же набор параметров, включая маркер разбиения на страницы для последующих вызовов

Включать TagFilters=[{'Key':'tag1'}] в вашем вызове get_resources внутри цикла с маркером разбиения на страницы

Выполните итерацию по каждому региону и вызовите get_resources для всех регионов

# List all regions
ec2_client = boto3.client('ec2')
regions = [region['RegionName'] for region in ec2_client.describe_regions()['Regions']]
2021-11-23 18:47:12

Я все еще сталкиваюсь с теми же проблемами,когда использую response_deployment = restag.get_resources(фильтры тегов=[{'Ключ':'tag1'}], ResourcesPerPage=100, PaginationToken=токен) в цикле while. Я обновил приведенный выше код.
Omega

Изменить: это потому, что API возвращает ресурсы только в том регионе, который используется в настоящее время. теперь это бесполезно...
Omega

ах, хорошо, почему бы не перебрать регионы и не сделать вызов get-resources рекурсивно. также обновите ответ
omuthu

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................