AWS Lambda:任务超时

jan*_*nsv 36 java amazon-web-services aws-lambda

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

我在Java中获取String变量的源代码.然后我有while循环尝试将String写入/ 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 ");
}
Run Code Online (Sandbox Code Playgroud)

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

Task timed out after 15.00 seconds
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ein 64

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

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

Lambda函数的最大执行时间限制为5分钟.创建Lambda函数时配置实际限制.限制已经到位,因为Lambda函数意味着小而快,而不是大型应用程序.

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

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


jpe*_*zov 13

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

代替

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

它是

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

  • 希望我能给你一百万张赞成票。你的暗示让我很高兴。多谢! (3认同)
  • 谢谢。只是想把它留在这里 https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html (2认同)

lal*_*war 13

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


小智 12

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

超时配置


and*_*amc 9

就我而言,当任务在本地运行正常但在Lambda上超时时,这是因为我需要增加分配给Lambda实例的内存。


小智 7

我通过将 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");
...
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的提示。有关更多详细信息 - 这将有助于以下两个原因:1) 现在 require 仅在 lambda 实例启动时发生,而不是每次 lambda 调用时发生,因此您可以在不进行冷启动时节省一些时间。2) 当 lambda 实例启动(冷启动)时,它有一个额外的 CPU 提升,用于像这样的函数体之外的事情,所以它比其他情况发生得更快。 (5认同)

小智 7

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