Создайте и загрузите файл в S3, используя функцию Lambda

1

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

import boto3
import os

def lambda_handler(event, context):
    src_bucket = event['Records'][0]['s3']['bucket']['name']
    filepath = event['Records'][0]['s3']['object']['key']

    head, tail = os.path.split(filepath)
    new_head = head.replace("/", "").upper()
    new_filename = "_".join((new_head, tail))

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

    string = "dfghj"
    encoded_string = string.encode("utf-8")

    file_name = "_".join(('ErrorLog', os.path.splitext(new_filename)[0]+'.txt'))
    print(file_name)
    s3_path = (head + '/errorlog/') + file_name
    print(s3_path)

    s3.Bucket(src_bucket).put_object(Key=s3_path, Body=encoded_string)

Выполняется без ошибок. Тем не менее, он входит в бесконечный цикл и продолжает создавать подпапки с errorlog/filename.

Например, если file_name = "ErrorLog_test1.txt" и s3_path = "folder1/errorlog/ErrorLog_test1.txt", он продолжает создавать подпапки как "errorlog" внутри себя с именем файла. Например, "folder1/errorlog/errorlog/errorlog/ErrorLog_test1.txt"

Как мне остановить создание рекурсивных папок? Я считаю, что я делаю что-то не так в настройке объекта s3_path.

Теги:
amazon-web-services
amazon-s3
aws-lambda

1 ответ

4

Похоже, вы настроили событие в корзине Amazon S3 для запуска функции Lambda при создании объекта.

Когда объект создается, запускается лямбда-функция. Функция Lambda создает объект S3. Это триггер и событие, которое запускает лямбда-функцию, которая создает объект... и т.д. Да, это бесконечный цикл, пока не будет достигнут некоторый предел.

Я не уверен, что вы делаете с объектами, но самый безопасный способ - настроить событие так, чтобы оно срабатывало только для заданного пути (подпапки). Затем настройте функцию Lambda для создания нового файла по другому пути, чтобы он не вызывал событие снова.

  • 0
    Джон, полностью имеет смысл. Спасибо за объяснение. Я попытался создать файл по другому пути, например: s3_path = 'errorlog /' + file_name, который по-прежнему создает несколько файлов, а затем выдает ошибку "Произошла ошибка (KeyTooLongError) при вызове операции PutObject: Ваш ключ слишком длинный: ClientError». Я пытаюсь выполнить проверку данных для входящего файла и создать файл журнала ошибок в том же пути к файлу.
  • 0
    Другой вариант - заставить лямбда-функцию просматривать входящий ключ (имя файла). Если это журнал ошибок, созданный ранее функцией Lambda, он должен просто выйти из функции Lambda, не создавая другой объект. Это успешно закоротит ситуацию, не меняя пути.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню