Как обрабатывать оставшуюся полезную нагрузку, когда обработчик получает тайм-аут в AWS лямбда? - PullRequest
2 голосов
/ 12 апреля 2020

Я пытаюсь преобразовать данные из CSV в JSON в AWS лямбда (используя Python 3). Размер файла составляет 65 МБ, поэтому время его ожидания до завершения процесса и получения полного выполнения завершается неудачно.

Мне нужно знать, как я могу справиться с таким случаем, когда AWS Lambda может обрабатывать максимальный набор данных за период ожидания и оставшаяся полезная нагрузка должны храниться в корзине S3.

Ниже приведен код преобразования

import json
import boto3
import csv
import os
json_content = {}


def lambda_handler(event, context):
    s3_source = boto3.resource('s3')
    if event:
        fileObj=event['Records'][0]
        fileName=str(fileObj['s3']['object']['key'])
        eventTime =fileObj['eventTime']    
        fileObject= s3_source.Object('inputs3', fileName)
        data = fileObject.get()['Body'].read().decode('utf-8-sig').split()
        arr=[]
        csvreader= csv.DictReader(data)
        newFile=getFile_extensionName(fileName,extension_type)
        for row in csvreader:
            arr.append(dict(row))
        json_content['Employees']=arr
        print("Json Content is",json_content)
        s3_source.Object('s3-output', "output.json").put(Body=(bytes(json.dumps(json_content).encode('utf-8-sig'))))
        print("File Uploaded")

    return {
        'statusCode': 200,
        'fileObject':eventTime,
     }

AWS Конфигурация лямбда-функции:

Память: 640 МБ

Время ожидания: 15 минут

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Поскольку ваша функция имеет тайм-аут, у вас есть только две опции:

  1. Увеличение объема назначенной памяти . Это также увеличит количество процессоров, назначенных для функции, поэтому должно работать быстрее. Однако этого может быть недостаточно, чтобы избежать тайм-аута.

или

Не использовать AWS Lambda .

Наиболее распространенный вариант использования AWS лямбда-функций - для небольших микроуслуг, иногда работающих только для нескольких секунд или даже доли секунды.

Если ваш вариант использования длится более 15 минут, то он, вероятно, не подходит для AWS Лямбда.

Вы можете посмотреть при таких альтернативах, как запуск кода на экземпляре Amazon EC2 или использование контейнера Fargate.

0 голосов
/ 12 апреля 2020

Похоже, вашей функции не хватает памяти:

Memory Size: 1792 MB Max Memory Used: 1792

Кроме того, она работала только в течение 12 минут:

Duration: 723205.42 ms

(723 секунды ≈ 12 минут)

Следовательно, вы должны либо:

  • Увеличить память (но это стоит дороже), или
  • Изменить программу так что вместо накопления строки JSON в памяти вы постоянно записываете ее в файл локального диска в /tmp/, а затем загружаете полученный файл в Amazon S3

Однако максимум дисковое пространство, предоставленное для AWS лямбда-функции, составляет 512 МБ, и кажется, что ваш выходной файл больше этого. Поэтому увеличение памяти будет единственным вариантом. Увеличение расходов, связанных с выделением большего количества ресурсов для функции Lambda, позволяет предположить, что вам лучше использовать EC2 или Fargate, а не Lambda.

...