Как запускать скрипт Python всякий раз, когда новые данные загружаются в ведро s3?

Aug 19 2020

Я пытаюсь вытащить данные из ведра s3, которое каждую секунду получает новые записи. Данные поступают со скоростью 250+ G в час. Я создаю сценарий Python, который будет работать непрерывно для сбора новых данных в режиме реального времени по секундам .

Вот структура ключей ведра s3:

o_key=7111/year=2020/month=8/day=11/hour=16/minute=46/second=9/ee9.jsonl.gz
o_key=7111/year=2020/month=8/day=11/hour=16/minute=40/second=1/ee99999.jsonl.gz

Я использую Boto3, чтобы попробовать это, и вот что у меня есть на данный момент:

s3_resource = boto3.resource('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, verify=False)
s3_bucket = s3_resource.Bucket(BUCKET_NAME)
files = s3_bucket.objects.filter()
files = [obj.key for obj in sorted(files, key=lambda x: x.last_modified, reverse=True)]
for x in files:
    print(x)

Это выводит все ключи, которые находятся в этом сегменте, и сортирует данные по last_modified. Однако есть способ , чтобы сделать паузу сценарий , пока не будет загружен новые данные , а затем обработать эти данные и так далее на второе ? При загрузке новых данных могут быть задержки в 20 секунд, так что это еще одна проблема, которая вызывает у меня проблемы при формировании логики. Любые идеи или предложения помогут.

 s3_resource = boto3.resource('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, verify=False)
 s3_bucket = s3_resource.Bucket(BUCKET_NAME)

 files = s3_bucket.objects.filter()
 while list(files): #check if the key exists
         if len(objs) > 0 and objs[0].key == key:
                   print("Exists!")
         else:
               time.sleep(.1) #sleep until the next key is there
               continue 

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

Ответы

r0ck Aug 19 2020 at 20:52

Функция уведомлений Amazon S3 позволяет получать уведомления, когда в вашей корзине происходят определенные события. Чтобы включить уведомления, вы должны сначала добавить конфигурацию уведомлений, которая определяет события, которые Amazon S3 должен публиковать, и места назначения, куда Amazon S3 должен отправлять уведомления. Вы сохраняете эту конфигурацию в подресурсе уведомлений, который связан с корзиной. - Обычно в лямбде ...

https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html

Надеюсь, это поможет
r0ck