当处理程序在AWS lambda中超时时,如何处理剩余的有效负载?

问题描述 投票:2回答:2

我正在尝试使用AWS 3 Lambda(使用Python 3)将数据从CSV转换为JSON。文件的大小为65 MB,因此在完成该过程之前它会超时,并且整个执行都会失败。

我将需要知道如何处理这样的情况,即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 Lambda函数配置:

内存:640 MB

超时:15分钟

python-3.x aws-lambda python-3.6 python-3.7 aws-serverless
2个回答
1
投票

由于您的功能已超时,所以只有两个选项:

  1. 增加分配的内存量。这也将增加分配给该功能的CPU数量,因此应该运行更快。但是,这可能不足以避免超时。

  1. 不要使用AWS Lambda

AWS Lambda函数最常见的用例是小型微服务,有时只运行几秒钟甚至一秒钟的时间。

如果您的用例运行了15分钟以上,那么它可能不是AWS Lambda的理想选择。

[您可以查看其他选择,例如在Amazon EC2实例上运行代码或使用Fargate容器。


0
投票

似乎您的函数内存不足:

Memory Size: 1792 MB Max Memory Used: 1792

而且,它只运行了12分钟:

Duration: 723205.42 ms

((723秒≈12分钟)

因此,您应该:

  • 增加内存(但这会花费更多),
  • 更改程序,以便将其不断写入本地磁盘文件至/tmp/中,而不是在内存中累积JSON字符串,然后将结果文件上传至Amazon S3

但是,提供给AWS Lambda函数的最大磁盘存储空间为512MB,并且看来您的输出文件大于此大小。因此,增加内存将是唯一的选择。与为Lambda函数分配更多资源有关的费用增加表明,使用EC2或Fargate而不是Lambda可能会更好。

© www.soinside.com 2019 - 2024. All rights reserved.