Пользовательская разбивка на страницы для метода Boto3 list_inventory_entries

#python #pagination #boto3

#python #разбивка на страницы #boto3

Вопрос:

 ec2_inventory = ssm.list_inventory_entries(
       InstanceId=instance_id, 
       TypeName='AWS:Application', 
       NextToken=next_token)

try:
    inventory_entry = ec2_inventory['Entries']

    for entry in inventory_entry:

        try:
                application_name = entry['Name']
        except:
                application_name = ''

        try:
                application_version = entry['Version']
        except:
                application_version = ''

        try:
                application_type = entry['ApplicationType']
        except:
                application_type = ''

        try:
                installed_time = entry['InstalledTime']
                
        except:
                installed_time = ''

        try:
                architecture = entry['Architecture']
        except:
                architecture = ''

        try:
                application_publisher = entry['Publisher']
        except:
                application_publisher = ''

        try:
                release = entry['Release']
        except:
                release = ''

        try:
                application_url = entry['URL']
        except:
                application_url = ''

        try:
                package_id = entry['PackageId']
        except:
                package_id = ''
  

Этот метод list_inventory_entries разбит на страницы для aws cli , но Boto3 не поддерживает разбивку на страницы, и я не знаю, как получить следующую страницу. Ограничение страницы, похоже, равно 50. в cli конце я получаю следующий токен, и метод имеет необязательный параметр NextToken , но у меня пока не работает

Комментарии:

1. в то время как next_token не является None:

2. next_token = ec2_inventory.get(‘nextToken’, нет)

Ответ №1:

Согласно документации list_inventory_entries boto3, существует

  1. параметр maxResults, с помощью которого вы ограничиваете ответы
  2. 'NextToken': 'string' в результате, который вы можете использовать в следующем вызове
  3. Параметр nextToken (string), который является маркером для следующего набора возвращаемых элементов. Вы получили этот токен из предыдущего вызова и используете его в следующем вызове.

Комментарии:

1. maxResults используется для ограничения количества возвращаемых записей. Мне нужен полный набор. Я использую nextToken, но проблема заключается в том, что при первом вызове nextToken ни одна итерация не завершается с ошибкой. Можете ли вы указать, как выполнить итерацию, когда nextToken равен None. если вы видите мой предыдущий комментарий, я использую while для итерации, и после того, как все будет сделано, я сохраняю nextToken в nex_token

2. Чтобы прояснить ситуацию — пожалуйста, отредактируйте свой код и включите while и next_token = ... в код вопроса, а не в комментарии к вопросу. Пожалуйста, также удалите whole for entry in inventory_entry: , который является самой большой частью вашего кода, но не связан с проблемой,

Ответ №2:

Это код, который сработал

     first_iteration = False
    if next_token == None:

        ec2_inventory = ssm.list_inventory_entries(InstanceId=instance_id, TypeName='AWS:Application')
        next_token = "something"

    while next_token is not None:                
        if first_iteration != False:
            ec2_inventory = ssm.list_inventory_entries(InstanceId=instance_id, TypeName='AWS:Application', NextToken=next_token)
        first_iteration = True
        inventory_entry = ec2_inventory['Entries']
        for entry in inventory_entry:
            try:
                application_name = entry['Name']
            except:
                application_name = ''
                                                                                        
        try:
            next_token = ec2_inventory.get('NextToken')
        except:
            next_token = None