繁体   English   中英

AWS Lambda:任务超时

[英]AWS Lambda: Task timed out

我们被要求为我的学校项目编写在 AWS Lambda 中运行的 Java 代码。 它应该获取特定 URL 的源代码,然后将其上传到 S3 存储桶。 Java 代码应该在 AWS Lambda 上运行。

我得到了 Java 中 String 变量的源代码。 然后我有 while 循环尝试将字符串写入 /tmp 目录中的文件。 然后将文件上传到 S3。

一切正常,但我被一个特定的 URL 卡住了。 我已经跟踪了这个问题:

try {
    BufferedWriter out = new BufferedWriter(new FileWriter("/tmp/url.txt"));
    out.write(source_code);  //Replace with the string 
    //you are trying to write  
    out.close();
}
catch (IOException e) {
    System.out.println("Exception ");
}

最奇怪的是,当我在本地测试代码时,一切正常。 文件在我计算机上的 /tmp 目录中创建,然后上传到 S3 存储桶。 但是,当我在 Lambda 中运行代码时,出现以下错误:

Task timed out after 15.00 seconds

知道为什么 Lambda 在这种特定情况下无法将文件写入其临时目录并且可以与其他人一起使用吗?

Amazon Lambda 旨在用作响应事件的事件驱动系统。 流程是:

  • 某处发生了触发Lambda 的事情(例如,上传到 Amazon S3、数据进入 Amazon Kinesis 流、直接调用 Lambda 函数的应用程序)
  • Lambda 函数被创建,来自触发器事件的数据被传递
  • Lambda 函数运行

Lambda 函数的最大执行时间限制为 15 分钟(最近从最初的 5 分钟超时增加了)。 实际限制是在创建 Lambda 函数时配置的。 限制已经到位,因为 Lambda 函数旨在小而快速,而不是大型应用程序。

您的错误消息说Task timed out after 15.00 seconds 这意味着一旦任务运行时间达到 15 秒,AWS 就会有意停止该任务 它与函数当时在做什么无关,也与正在处理的文件无关。

解决方法:增加 Lambda 函数配置页面上的超时设置。

您似乎将超时配置为 15 秒。您可以按照此屏幕截图中的说明增加超时,并且根据 lambda 设置,它允许您执行的最大时间为 15 分钟。

超时配置

在我的情况下,当任务在本地运行良好但在 Lambda 上超时时,这是因为我需要增加分配给 Lambda 实例的内存。

对于那些在使用async时遇到这个超时问题的人,请注意异步函数的处理程序的模式不同。

代替

exports.handler = function (event, context, callback) {
    callback(null, {
        statusCode: 200,
        body: JSON.stringify({/* return stuff here */})
    });
};

它是

exports.handler = async function (event, context) {
    return {
        statusCode: 200,
        body: JSON.stringify({/* return stuff here */})
    };
};

您可以将 lambda 函数的超时时间增加到 15 分钟,或者您可以增加对 lambda 函数的内存分配以使其更快。 您可以将内存增加到 3008MB。 其最小值为 128MB。 如果您有以下情况,它会像这样: 为您的 lambda 函数分配大内存分配比执行该 lambda 函数所需的时间更少,反之亦然。 每次执行 lambda 函数时,大内存分配会花费更多。 您需要计算超时时间和分配给 lambda 函数的内存的平衡。 不要只是分配大块内存,以便您可以很快看到结果,分析成本和您的需求。 附一张图,其中更改超时和内存分配。 转到您的 Lambda 函数 -> 配置 -> 基本设置以查找设置。 转到您的 Lambda 函数 -> 配置 -> 基本设置

我通过将 AWS-SDK 放在函数体之外解决了这个问题:

 var AWS = require("aws-sdk"); exports.handler = function(event, context, callback) { //var AWS = require("aws-sdk"); //Error: Task timed out after 3.00 seconds var docClient = new AWS.DynamoDB.DocumentClient(); console.log("Lambda starts"); ...

最近,我正在研究一个 POC 以使用 AWS Lambda 函数。 我也面临同样的问题(任务在 15.01 秒后超时)。 我只是增加了内存分配,它解决了问题。 美妙之处在于我可以在几秒钟内得到响应。 所以,我认为错误几乎没有误导性。 它应该提供失败的确切根本原因。

我遇到了同样的问题,但它是间歇性发生的。 我在使用 Insights n XRay 进行调试时浪费了更多时间,但没有从中得到任何好处。

最后我尝试了一件事,我的 VPC 中有 2 个子网,私有和公共。 所以我只保留了私有子网并删除了另一个。

瞧!!

它不再失败..但我仍然不知道原因,将保持发布。 如果可行,请尝试使用单个子网运行 lambda。

首先,为什么要写入/tmp/? 您写入执行 Lambda 函数的同一位置?

但是,更好的做法是,如果您想将字符串写入 S3 文件,那么您可以创建一个 S3Object 并将其直接写入 AWS S3。 这是一个显示示例的帖子: https : //stackoverflow.com/a/29844224/358013

暂无
暂无

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

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