繁体   English   中英

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

[英]How to processes remaining payload when the handler get timeout in AWS lambda?

我正在尝试将 AWS lambda 中的数据从 CSV 转换为 JSON (使用 ZA7F5F354216B927411739) 文件的大小为 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 function 配置:

Memory:640 MB

超时:15 分钟

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

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

或者

  1. 不要使用 AWS Lambda

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

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

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

看起来您的 function 的 memory 用完了:

Memory Size: 1792 MB Max Memory Used: 1792

此外,它只运行了 12 分钟:

Duration: 723205.42 ms

(723 秒 ≈ 12 分钟)

因此,您应该:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM