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

Я пишу лямбда-функцию для создания текстового файла и загрузки в определенный каталог 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)

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

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

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

1 Ответ

0 голосов
/ 08 января 2019

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

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

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

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