【问题标题】:How to processes remaining payload when the handler get timeout in AWS lambda?当处理程序在 AWS lambda 中超时时如何处理剩余的有效负载?
【发布时间】:2020-07-24 18:15:27
【问题描述】:

我正在尝试在 AWS lambda 中将数据从 CSV 转换为 JSON(使用 Python 3)。文件大小为 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 分钟

【问题讨论】:

  • 您的 AWS Lambda 函数是同步调用还是异步调用?为您的功能设置的超时时间是多少?转换性能是否受可用 CPU 性能的限制?你的转换代码是什么样子的?
  • AWS Lambda 的最大超时时间为 15 分钟,在 65 MB 的文件中,您正在处理多少行?如果您可以发布您的代码,我们也可以尝试一些优化。
  • 嗨@Dunedan 和 Hussain,我已经更新了代码和其他详细信息。它是一个基本的 csv 到 json 转换。你可以看看
  • 您能否提供执行此 AWS Lambda 函数产生的日志消息?如果将可用内存增加到 1792MB,问题会消失吗?
  • 嗨@Dunedan .. 这是来自 lambda 执行的日志 ### REPORT RequestId: 53abacf2-8484-2342347 持续时间:723205.42 毫秒计费持续时间:723300 毫秒内存大小:1792 MB 使用的最大内存: 1792 MB 初始化持续时间:252.77 毫秒 RequestId:53abacf2-848431312312 错误:运行时因错误退出:信号:已终止 Runtime.ExitError

标签: python-3.x aws-lambda python-3.6 python-3.7 aws-serverless


【解决方案1】:

您的函数似乎内存不足:

Memory Size: 1792 MB Max Memory Used: 1792

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

Duration: 723205.42 ms

(723 秒 ≈ 12 分钟)

因此,您应该:

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

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

【讨论】:

    【解决方案2】:

    由于您的函数超时,您只有两个选择:

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

    1. 不要使用 AWS Lambda

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

    如果您的用例运行时间超过 15 分钟,那么它可能不适合 AWS Lambda。

    您可以查看替代方案,例如在 Amazon EC2 实例上运行代码或使用 Fargate 容器。

    【讨论】:

      猜你喜欢
      • 2019-05-07
      • 1970-01-01
      • 2022-08-11
      • 2019-12-07
      • 2020-11-12
      • 2012-06-14
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      相关资源
      最近更新 更多