Перемещайте файлы между папками на Amazon S3 с помощью boto3 - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь переместить файлы из одной папки в другую в том же сегменте после завершения обработки каждого из них. Я запускаю этот сценарий python3 на экземпляре EC2.

import os.path
from boto3.session import Session
ACCESS_KEY = 'XXXXXXXXXXXXXXXX'
SECRET_KEY = 'YYYYYYYYYYYYYYYYYY'
BUCKET_NAME = 'test-s3logs'
MAX_FILES_READ = 10
SOURCE_PREFIX = 'logs/'
DESTINATION_PREFIX = 'processed/'
words = ['London', 'user/xxxx']

if __name__ == "__main__":
    # Use Boto to connect to S3 and get a list of objects from a bucket
    session = Session(aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
    s3 = session.resource('s3')
    # call S3 to list current buckets
    source_bucket = s3.Bucket(BUCKET_NAME)
    dest_bucket = s3.Bucket(BUCKET_NAME)

    index = 0
    for s3_file in source_bucket.objects.filter(Prefix=SOURCE_PREFIX):
        index += 1
        if index == MAX_FILES_READ:
            break
        found_get_record = False
        source_obj = s3.Object(BUCKET_NAME, s3_file.key)
        for line in source_obj.get()['Body']._raw_stream:
            line_found = line.decode('utf-8')
            if all(word in line_found for word in words):
                found_get_record = True
                # insert record in database
                print ('insert into db')

        if found_get_record:
            # move the file to processed folder
            print ('moving file: {}', format(s3_file.key))
            old_source = { 'Bucket': BUCKET_NAME,'Key': s3_file.key}
            dest_obj = dest_bucket.Object(s3_file.key.replace(SOURCE_PREFIX, DESTINATION_PREFIX, 1))
            dest_obj.copy(old_source)
            source_obj.delete()
        else:
            # delete file.
            print ('deleting file: {}', format(s3_file.key))
            source_obj.delete()

Logi c:

  1. Папка "logs" заполняется файлами журналов из другой процесс.

  2. Этот скрипт периодически проверяет папку «logs» и открывает ее на чтение, проверяет определенные ключевые слова. Если найдено, некоторые детали вставляются в БД и файл перемещается в «обработанную» папку. Если ключевые слова не найдены, файл журнала просто удаляется.

Вопрос:

  1. Если в файле не осталось файлов журнала, сценарий также удаляет папку «журналы». Как это остановить?

  2. Я приложил все усилия со сценарием. Есть ли способ убрать это?

В остальном работает нормально.

1 Ответ

1 голос
/ 10 января 2020

Папки на самом деле не существуют в Amazon S3.

Например, вы можете создать объект с именем invoices/foo.txt, и он будет работать нормально, даже если папка invoices отсутствует. Папка invoices волшебным образом появится в консоли, а также волшебным образом исчезнет, ​​когда в ней больше не будет объектов.

Поэтому, один из вариантов - просто , не беспокойтесь о папках .

Если вы делаете при создании папки в консоли управления S3, создается объект нулевой длины с ключом, равным имени папки . Это заставляет пустую папку появляться, даже если она на самом деле не существует.

Чтобы предотвратить удаление «папки», просто не удаляйте этот объект нулевой длины с тем же самым имя в качестве папки. Ваш код может либо проверить длину объекта, либо проверить, совпадает ли его ключ с именем папки (с его полным путем). Если это так, не удаляйте его.

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