S3 boto3 список ключей после метки времени в метаданных - PullRequest
0 голосов
/ 25 сентября 2018

Мне нужно перечислить все ключи в корзине S3, которые были изменены после определенной отметки времени с использованием boto3.

Я сделал эти функции, но производительность довольно низкая для корзин с несколькими ключами.

s3 = boto3.resource('s3',
         aws_access_key_id=s3_cred.ACCESS_KEY,
         aws_secret_access_key= s3_cred.SECRET_KEY)

my_bucket = s3.Bucket(BUCKET_NAME)

def meta_df(bucket):
    key = []
    ts = []
    for o in bucket.objects.all():
        key.append(o.key)
        ts.append(o.last_modified)
    return pd.DataFrame({'key':key,'ts':ts})


def get_after_timestamp(bucket,ts):
    df = meta_df(bucket)
    df = df[df['ts']>ts]
    return df['key'].tolist()

get_after_timestamp(my_bucket,'2018-09-24 13:39:00')

Есть ли способ сделать это в boto3 или более быстрым способом?

1 Ответ

0 голосов
/ 26 сентября 2018

Один из вариантов - использовать Amazon S3 Inventory , который может предоставить ежедневный список объектов в корзине Amazon S3.

Таким образом, вам просто нужно скорее проанализировать списокчем сделать вызовы API, чтобы перечислить объекты.Тем не менее, листинг в лучшем случае только ежедневно, поэтому это зависит от того, нужна ли вам самая свежая информация.

Обновление:

Поскольку у вас есть 500 000 объектовчто вы хотите сканировать каждые 5 минут, вам понадобится другой подход .Это связано с тем, что сканирование такого количества файлов (при котором каждый вызов API извлекает только 1000 объектов одновременно) будет медленным и неэффективным.

Вместо этого вам следует:

  • Создать S3 Event в корзине, которая запускает лямбда-функцию при каждой загрузке нового объекта
  • Лямбда-функция сохраняет сведения об объекте в базе данных (например, DynamoDB)
  • Вместо сканирования S3 каждые 5 минут, обратитесь к базе данных для получения списка объектов

Вот несколько примеров:

...