Как получить более 1000 объектов из S3, используя list_objects_v2? - PullRequest
0 голосов
/ 22 января 2019

У меня есть более 500 000 объектов на s3.Я пытаюсь получить размер каждого объекта.Я использую следующий код Python для этого

import boto3

bucket = 'bucket'
prefix = 'prefix'

contents = boto3.client('s3').list_objects_v2(Bucket=bucket,  MaxKeys=1000, Prefix=prefix)["Contents"]

for c in contents:
    print(c["Size"])

Но это просто дало мне размер топ-1000 объектов.На основании документации мы не можем получить больше 1000. Есть ли способ, которым я могу получить больше, чем это?

1 Ответ

0 голосов
/ 22 января 2019

Используйте ContinuationToken, возвращенный в ответе, в качестве параметра для последующих вызовов, пока значение IsTruncated, возвращенное в ответе, не станет ложным.

Это можно включить в аккуратную функцию генератора:

def get_all_s3_objects(s3, **base_kwargs):
    continuation_token = None
    while True:
        list_kwargs = dict(MaxKeys=1000, **base_kwargs)
        if continuation_token:
            list_kwargs['ContinuationToken'] = continuation_token
        response = s3.list_objects_v2(**list_kwargs)
        yield from response.get('Contents', [])
        if not response.get('IsTruncated'):  # At the end of the list?
            break
        continuation_token = response.get('NextContinuationToken')

for file in get_all_s3_objects(boto3.client('s3'), Bucket=bucket, Prefix=prefix):
    print(file['size'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...