AWS Lambda:任务超时

时间:2017-04-23 23:47:47

标签: java amazon-web-services aws-lambda

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

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

一切正常,但我遇到了一个特定的网址。我已经跟踪了这个问题:

2

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

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 ");
}

知道为什么Lambda在这个特定情况下无法将文件写入临时目录并且与其他人一起工作?

9 个答案:

答案 0 :(得分:45)

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

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

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

您的错误消息显示为Task timed out after 15.00 seconds。这意味着AWS 在达到15秒的运行时后故意停止任务。它与当时函数的功能无关,也与正在处理的文件无关。

修复:在Lambda函数的配置页面上增加超时设置。

答案 1 :(得分:7)

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

答案 2 :(得分:6)

您可以将lambda函数的超时延长到15分钟,或者可以增加对lambda函数的内存分配以使其更快。您最多可以将内存增加到3008MB。最小值为128MB。 如果您有以下情况,它将像这样: 为您的lambda函数分配的大内存分配比执行该lambda函数所需的时间更少,反之亦然。较大的内存分配会使每次执行lambda函数花费更多。您需要找出超时时间和分配给lambda函数的内存之间的平衡。不要仅仅分配大量的内存,这样您就可以很快看到结果并分析成本和需求。 所附的数字是更改超时和内存分配的地方。转到Lambda函数->配置->基本设置以查找设置。 Goto Your Lambda function -> Configuration -> Basic Setting

答案 3 :(得分:3)

您似乎已将超时配置为15秒。您可以按照此屏幕快照timeout configuration中所述增加超时,并且根据lambda设置,它允许您执行的最大时间为15分钟。希望这可以帮助!

答案 4 :(得分:1)

我通过将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");
...

答案 5 :(得分:1)

对于使用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 */})
    };
};

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

最近,我正在研究POC以使用AWS Lambda函数。我也遇到了同样的问题(任务在15.01秒后超时)。我只是增加了内存分配,它解决了问题。美丽之处在于,我可以在几秒钟内得到回应。因此,我认为错误很少会引起误解。它应该提供确切的故障根本原因。

答案 8 :(得分:0)

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

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

瞧!

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