AWS Lambda:任务超时
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在这种特定情况下无法将文件写入其临时目录,而其他情况下却可以?
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。
AWS Lambda: Task timed out问题的出现原因是函数的执行时间超过了配置的超时时间。解决方法是增加超时时间。
在AWS Lambda中,函数的超时时间默认为3秒,可以根据需要进行配置。在配置页面中,可以看到超时时间的设置选项。根据截图中的示例,超时时间被配置为15秒。
超时时间的配置可以通过增加超时时间来解决。根据Lambda的设置,最长允许执行时间为15分钟。
要增加超时时间,可以按照以下步骤进行操作:
1. 打开AWS Lambda的管理控制台。
2. 选择要配置超时时间的函数。
3. 在函数配置页面中,找到超时时间设置选项。
4. 将超时时间设置为需要的时间,可以选择最长为15分钟。
5. 保存配置并重新运行函数。
通过增加超时时间,可以解决AWS Lambda: Task timed out问题,确保函数有足够的时间来执行任务。
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函数。
太棒了!非常感谢!我之前不知道有这些步骤函数,我会去看一下。最好!