我们已经要求我的学校项目编写一个在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在这个特定情况下无法将文件写入临时目录并且与其他人一起工作?
答案 0 :(得分:45)
Amazon 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函数->配置->基本设置以查找设置。
答案 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。