Jak uzyskać środki ze WSZYSTKICH regionów za pomocą ResourceGroupsTaggingAPI

0

Pytanie

Próbuję pobrać wszystkie ARN z określonymi znacznikami za pomocą boto3 i ResourceGroupsTaggingAPI. Ja przepuszczam na dwóch znaczników i uzyskać 8 różnych ARN, kiedy powinienem dostać ponad 80 ARN.

**Edit:**rozumiem, że to ze względu na ograniczenia API. Zgodnie z dokumentacją API pozwala usuwać tagi z regionu, który używasz w tej chwili. Czy jest jakiś sposób, aby uzyskać tagi z WSZYSTKICH regionów?

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

Najlepsza odpowiedź

0

Jest to związane z tym, że u ciebie były filtry tagów przy pierwszym wywołaniu i pominięcia ich przy następnym wywołaniu z podziałem na strony

Połączenia z podziałem na strony powinny zawierać jeden i ten sam zestaw parametrów, w tym znacznik podziału na strony dla kolejnych połączeń

Obejmować TagFilters=[{'Key':'tag1'}] w swoim wywołaniu get_resources wewnątrz pętli z markerem podział na strony

Wykonaj iteracji dla każdego regionu i wywołaj get_resources dla wszystkich regionów

# 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

Ja jeszcze do czynienia z tymi samymi problemami,gdy używam response_deployment = restag.get_resources(filtry tag=[{'Klucz':'tag1'}], ResourcesPerPage=100, PaginationToken=token) w pętli while. Zaktualizowałem powyższy kod.
Omega

Edycja: to dlatego, że API zwraca zasoby tylko w tym regionie, który jest aktualnie używany. teraz to nie ma sensu...
Omega

ach, dobrze, dlaczego nie przejść przez regiony i nie zrobić połączenie get-resources rekurencyjnie. również zaktualizować odpowiedź
omuthu

W innych językach

Ta strona jest w innych językach

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