AWS S3: уведомление для файлов в определенной папке - PullRequest
0 голосов
/ 14 апреля 2020

в сегментах S3 у нас есть папка, в которую помещаются входящие файлы. А потом какая-то наша система берет это и обрабатывает.

Я хочу узнать, сколько файлов в этой папке старше некоторого периода, а затем отправить уведомление в соответствующую команду.

Т.е. в бункере S3, если какой-то файл поступил сегодня, и он все еще там даже через 3 часа, я хочу получать уведомление.

Я думаю использовать библиотеку boto python, чтобы перебирать все объекты внутри корзины S3 с установленным интервалом для проверки файлов в папке. А затем отправьте уведомление. Тем не менее, это решение не кажется хорошим.

Я думаю, что есть какое-то решение на основе событий. Я знаю, что у S3 есть события, на которые я могу подписаться, используя очередь или лямбду. Тем не менее, я не хочу делать никаких действий, как только у меня появится файл, я просто хочу проверить, какие файлы старше, чем какое-то время, и отправить уведомление по электронной почте.

Можем ли мы достичь этого, используя основанное на событиях решение?

В час мы ожидаем около 1000 файлов. После обработки файла они перемещаются в другую папку. Однако, если что-то пойдет не так, оно будет там. Поэтому в день я не ожидаю более 10 000 файлов в одном ведре. Считайте, что у меня есть несколько ведер.

Ответы [ 2 ]

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

Вы можете создать Правило события Amazon CloudWatch , которое запускает функцию AWS Лямбда в нужный интервал времени (например, каждые 5 минут или один раз в час).

AWS Лямбда-функция может перечислять нужную папку, ища файлы старше, чем желаемый период времени. Это было бы что-то вроде этого:

import boto3
from datetime import datetime, timedelta, timezone

s3_client = boto3.client('s3')

paginator = s3_client.get_paginator('list_objects_v2')
page_iterator = paginator.paginate(
    Bucket = 'my-bucket',
    Prefix = 'to-be-processed/'
)

for page in page_iterator:
    for object in page['Contents']:
        if object['LastModified'] < datetime.now(tz=timezone.utc) - timedelta(hours=3):
            // Print name of object older than given age
            print(object['Key'])

Тогда вы могли бы попросить кого-нибудь об этом уведомить. Самым простым способом было бы отправить сообщение на Amazon SNS topi c, и тогда люди могут подписаться на эту топи c через SMS или по электронной почте , чтобы получить уведомление.

Приведенный выше код довольно прост в том, что он будет каждый раз находить один и тот же файл, а не только новые файлы, которые были добавлены в период уведомления.

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

Пропускать файлы S3 для выполнения такого фильтра - не очень хорошая идея. Это может стать очень медленным, когда у вас там более тысячи файлов. Я бы предложил вам использовать базу данных для хранения этих записей.

У вас может быть динамодаб с 2 столбцами: имя файла и дата загрузки. Или, если бюджет является проблемой, вы можете даже иметь файл sqlite3 в корзине и извлекать его всякий раз, когда вам нужно запросить или добавить к нему данные. Я сделал это с помощью лямбды, и она работает просто отлично. Только не забудьте загрузить файл снова, когда будут вставлены новые записи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...