AWS Lambda:任务超时

5 浏览
0 Comments

AWS Lambda:任务超时

我们被要求为我的学校项目编写一个在AWS Lambda中运行的Java代码。它应该获取特定URL的源代码,然后将其上传到S3存储桶中。Java代码应该在AWS Lambda上运行。\n我将源代码获取到Java的字符串变量中。然后,我有一个while循环,尝试将字符串写入/tmp目录中的文件。然后将文件上传到S3。\n一切都正常,但我在一个特定的URL上遇到了问题。我已经追踪到了这个问题:\n

try {
    BufferedWriter out = new BufferedWriter(new FileWriter("/tmp/url.txt"));
    out.write(source_code);  //用要写入的字符串替换
    //你正在尝试写入的字符串
    out.close();
}
catch (IOException e) {
    System.out.println("异常");
}

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

任务在15.00秒后超时

\n有任何想法为什么Lambda在这种特定情况下无法将文件写入其临时目录,而其他情况下却可以?

0
0 Comments

AWS Lambda: Task timed out是指在使用异步函数时遇到超时问题。问题的出现原因是使用了错误的处理程序模式。解决方法是使用正确的处理程序模式。

错误的处理程序模式:

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 */})
    };
};

感谢提供这个提示,让我解决了超时问题。非常感谢!也想在这里留下一个链接:docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html

0
0 Comments

AWS Lambda: Task timed out问题的出现原因是函数的执行时间超过了配置的超时时间。解决方法是增加超时时间。

在AWS Lambda中,函数的超时时间默认为3秒,可以根据需要进行配置。在配置页面中,可以看到超时时间的设置选项。根据截图中的示例,超时时间被配置为15秒。

超时时间的配置可以通过增加超时时间来解决。根据Lambda的设置,最长允许执行时间为15分钟。

要增加超时时间,可以按照以下步骤进行操作:

1. 打开AWS Lambda的管理控制台。

2. 选择要配置超时时间的函数。

3. 在函数配置页面中,找到超时时间设置选项。

4. 将超时时间设置为需要的时间,可以选择最长为15分钟。

5. 保存配置并重新运行函数。

通过增加超时时间,可以解决AWS Lambda: Task timed out问题,确保函数有足够的时间来执行任务。

0
0 Comments

AWS Lambda: Task timed out

AWS Lambda是一种响应事件的事件驱动系统。其流程如下:

- 某个事件在某个地方触发了Lambda(例如上传到Amazon S3,数据进入Amazon Kinesis流,应用程序直接调用Lambda函数)

- 创建Lambda函数,传递来自触发事件的数据

- 运行Lambda函数

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

您的错误信息显示“Task timed out after 15.00 seconds”。这意味着AWS在达到15秒的运行时间后故意停止了任务。这与函数在此时正在进行的操作或正在处理的文件无关。

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

我同意。您需要增加Lambda超时限制,最长可以增加到5分钟。您的代码处理时间超过了15秒。

那正是我尝试过的,我已经将超时时间增加到2分钟,但仍然没有运气。我的Lambda函数每15分钟运行一次,由Jenkins触发。我不明白的是,当在本地运行时,它完全正常,但在Lambda上运行时失败。这也发生在一个特定的网站上,其他网站都正常,Lambda能正确处理。另外,您认为直接从内存上传到S3桶而不将任何内容存储在/tmp目录中会更好吗?非常感谢。

既然您将超时时间增加到了2分钟,是否收到了“120秒后超时”的消息?如果是这样,意味着事情还没有完成。您应该尽可能多地记录信息,然后使用日志来找出消耗时间的原因。(这就是编程的乐趣!)确保在上传后删除/tmp目录中的文件,否则会耗尽空间。在上传之前记录文件的大小是一个好主意,这样如果失败了,您就会知道它试图做什么。

非常感谢您,约翰,感谢您的一切回复。我将尽量详细说明。我的程序将URL的源代码存储在字符串中,然后与/tmp目录中已存在的文件(上一次运行的源代码)进行比较,如果有变化,则将其上传到S3桶中。因此,/tmp存储最新的源代码文件以供比较。我想知道这是否是一个好的实践?我逐步追踪问题,当它尝试写入文件时,程序会被卡住。我不明白的是,它只在一个特定的网站上失败。

是的,即使增加了超时时间,仍然会收到相同的消息。但是我认为120秒太长了,因为通常只需要大约7秒。

您不应该假设/tmp目录中有来自之前Lambda调用的文件。Lambda可能会重用一个容器,也可能会创建一个新的容器。这就是为什么使用后应该清空/tmp,以防止其填满。最多可使用500MB的存储空间。底线是...记录所有内容并查看日志文件!

_Rotenstein我已经修改了我的代码,现在它只与S3文件一起使用。然而,我仍然遇到相同的错误。我已经追踪到了错误所在。我在这里解释了:stackoverflow.com/questions/43577746不过还不知道为什么会发生这种情况。

您链接回了相同的问题?

抱歉,我弄错了。这是正确的链接:stackoverflow.com/questions/43623338

抱歉在这里问,但您知道是否可以将Lambda函数内部的超时状态保存到数据库中,例如?是否可能在函数超时后运行某些东西?

一旦函数超时,执行环境就会被冻结/终止。在函数超时后触发某些操作是不可能的。但是,您可以尝试使用AWS Step Functions来运行Lambda函数,并响应超时,然后触发一些不同的逻辑,例如等待一段时间,然后执行不同的Lambda函数。

太棒了!非常感谢!我之前不知道有这些步骤函数,我会去看一下。最好!

0