Я пишу лямбда-функцию для создания текстового файла и загрузки в определенный каталог 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 S3 для запуска функции Lambda при создании объекта.
Когда объект создается, запускается лямбда-функция. Функция Lambda создает объект S3. Это триггер и событие, которое запускает лямбда-функцию, которая создает объект... и т.д. Да, это бесконечный цикл, пока не будет достигнут некоторый предел.
Я не уверен, что вы делаете с объектами, но самый безопасный способ - настроить событие так, чтобы оно срабатывало только для заданного пути (подпапки). Затем настройте функцию Lambda для создания нового файла по другому пути, чтобы он не вызывал событие снова.