Проверьте S3 Bucket на наличие новых файлов за последние два часа - PullRequest
0 голосов
/ 10 октября 2018

Мне нужно создать инструмент мониторинга, который проверяет сегменты (по 1000+ файлов в каждом) на наличие новых объектов, созданных за последние два часа, и, если объекты не были созданы, отправляет сообщение.Моей первой идеей было создать лямбда-функцию, которая будет запускаться каждые 20 минут.Итак, я создал код python3 + boto3:

import boto3
from datetime import datetime,timedelta
import pytz
import sys

s3 = boto3.resource('s3')
sns = boto3.client('sns')

buckets = ['bucket1', 'bucket2', 'bucket3']
check_fail = []

def check_bucket(event, context):
    time_now_UTC = datetime.utcnow().replace(tzinfo=pytz.UTC)
    delta_hours = time_now_UTC - timedelta(hours=2)

    for bucket_name in buckets:
        bucket = s3.Bucket(bucket_name)
        for key in bucket.objects.all():
            if key.last_modified >= delta_hours:
                print("There are new files in the bucket %s" %bucket)
                break
        else:
            check_fail.append(bucket)

    if len(check_fail) >= 1:    
        sns.publish(
        TopicArn='arn:aws:sns:us-east-1:xxxxxxxxxxxxxx:xxxxxx',
        Message="The following buckets didn't receive new files for longer than 2 hours: %s" %check_fail,
        Subject='AWS Notification Message' )
    else: 
        print("All buckets have new files")

Этот подход не работает из-за большого количества объектов внутри каждого сегмента.Проверка по «key.last_modified» занимает слишком много времени.

У кого-нибудь есть идеи, как мне этого добиться?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Как вы уже видели, S3 оптимизирован для получения объекта, путь к которому вы уже знаете, вместо того, чтобы перечислять запрашивающие файлы.На самом деле API listObjects не очень устойчив во время итерации, и вы, вероятно, пропустите файлы в больших наборах, если они будут добавлены до того, как вы начали запрос.

В зависимости от количества сегментов, которые у вас есть, способвокруг этого можно использовать лямбда-триггеры для событий S3:

  • S3 автоматически вызывает событие s3: ObjectCreated и вызывает лямбду
  • Лямбда устанавливает атрибут "LastUpdate" для записи этого сегмента в DynamoDb
  • Каждые 20 минут (или около того) вы запрашиваете / сканируете таблицу «Динамо», чтобы увидеть, когда происходит последнее обновление.

Другое решение - включить мониторинг CloudWatch в корзине: https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html

Затем вы можете суммировать метрики PutRequests и PostRequests за последние два часа (вы можете получить метрики Cloudwatch это программно, используя boto3), чтобы получить информацию об обновлениях (хотя ваш подсчет вероятен толькобыть точным, если файлы записаны один раз и никогда не редактировались).

0 голосов
/ 10 октября 2018

Amazon S3 может публиковать события в Lambda и вызывать вашу функцию, передавая данные события S3 в качестве параметра.Таким образом, вы можете настроить его таким образом, чтобы каждый новый загруженный объект s3 запускал вашу функцию.Нет необходимости планировать это вообще.

...