boto3 - Получение файлов, загруженных только в прошлом месяце в S3 - PullRequest
0 голосов
/ 15 апреля 2020

Я пишу python3 лямбда-функцию, которая должна возвращать все файлы, которые были загружены в корзину S3 за последние 30 дней с момента запуска функции.

Как мне подойти к этому? В идеале я хочу перебирать только файлы за последние 30 дней и ничего больше - в корзине S3 есть тысячи и тысячи файлов, через которые я перебираю, и, возможно, будет обновляться / загружаться максимум 100 в месяц. Было бы очень неэффективно перебирать каждый файл и сравнивать такие даты. Для шлюза API AWS также существует ограничение времени в 29 секунд.

Любая помощь будет принята с благодарностью. Спасибо!

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Я не могу дать вам 100% ответ, так как вы запросили дату загрузки, но если вы можете использовать значение «Последнее изменение», этот фрагмент кода должен выполнить эту работу:

import boto3
import datetime

paginator = boto3.resource('s3').meta.client.get_paginator('list_objects')
date = datetime.datetime.now() - datetime.timedelta(30)
filtered_files = (page['Key'] for page in paginator.paginate(Bucket="bucketname").search(f"Contents[?to_string(LastModified)>='\"{date}\"']"))

Для фильтрации я использовал JMESPath

0 голосов
/ 16 апреля 2020

Вам нужно будет выполнить итерацию по списку объектов (пример кода: Перечислите сегменты s3 с его размером в формате csv ) и сравнить дату в коде Python ( пример кода: Получение дневных путей к файлам из корзины s3 ).

Нет фильтра при перечислении объектов (кроме префикса).

Альтернативой является использование Amazon S3 Inventory , который может предоставить ежедневный CSV-файл со списком содержимого корзины. Вы можете проанализировать этот CSV вместо перечисления объектов.

Более экстремальный вариант - сохранить отдельную базу данных объектов, которая должна обновляться при добавлении / удалении объектов. Это можно сделать с помощью событий Amazon S3, которые запускают функцию AWS Lambda. Впрочем, много работы.

...