I am unsuccessfully trying to write to the file system of an aws lambda instance. The docs say that a standard lambda instance has 512mb of space available at /tmp/
. However the following code that runs on my local machine isn't working at all on the lambda instance:
我没有成功写入aws lambda实例的文件系统。文档说标准的lambda实例在/ tmp /处有512mb的可用空间。但是,在本地计算机上运行的以下代码在lambda实例上根本不起作用:
var fs = require('fs');
fs.writeFile("/tmp/test.txt", "testing", function(err) {
if(err) {
return console.log(err);
}
console.log("The file was saved!");
});
The code in the anonymous callback function is never getting called on the lambda instance. Anyone had any success doing this? Thanks so much for your help.
匿名回调函数中的代码永远不会在lambda实例上调用。这有什么成功的吗?非常感谢你的帮助。
It's possible that this is a related question. Is it possible that there is some kind of conflict going on between the s3 code and what I'm trying to do with the fs callback function? The code below is what's currently being run.
这可能是一个相关的问题。是否有可能在s3代码和我正在尝试使用fs回调函数之间发生某种冲突?下面的代码是当前正在运行的代码。
console.log('Loading function');
var aws = require('aws-sdk');
var s3 = new aws.S3({ apiVersion: '2006-03-01' });
var fs = require('fs');
exports.handler = function(event, context) {
//console.log('Received event:', JSON.stringify(event, null, 2));
// Get the object from the event and show its content type
var bucket = event.Records[0].s3.bucket.name;
var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
var params = {
Bucket: bucket,
Key: key
};
s3.getObject(params, function(err, data) {
if (err) {
console.log(err);
var message = "Error getting object " + key + " from bucket " + bucket +
". Make sure they exist and your bucket is in the same region as this function.";
console.log(message);
context.fail(message);
} else {
//console.log("DATA: " + data.Body.toString());
fs.writeFile("/tmp/test.csv", "testing", function (err) {
if(err) {
context.failed("writeToTmp Failed " + err);
} else {
context.succeed("writeFile succeeded");
}
});
}
});
};
2 个解决方案
#1
12
Modifying your code into the Lambda template worked for me. I think you need to assign a function to exports.handler
and call the appropriate context.succeed()
or context.fail()
method. Otherwise, you just get generic errors.
将代码修改为Lambda模板对我有用。我认为你需要为exports.handler分配一个函数,并调用相应的context.succeed()或context.fail()方法。否则,您只会得到一般错误。
var fs = require("fs");
exports.handler = function(event, context) {
fs.writeFile("/tmp/test.txt", "testing", function (err) {
if (err) {
context.fail("writeFile failed: " + err);
} else {
context.succeed("writeFile succeeded");
}
});
};
#2
7
So the answer lies in the context.fail()
or context.succeed()
functions. Being completely new to the world of aws and lambda I was ignorant to the fact that calling any of these methods stops execution of the lambda instance.
所以答案在于context.fail()或context.succeed()函数。作为aws和lambda世界的全新,我对于调用这些方法中的任何一个停止执行lambda实例这一事实一无所知。
According to the docs:
根据文件:
The context.succeed() method signals successful execution and returns a string.
context.succeed()方法表示成功执行并返回一个字符串。
By eliminating these and only calling them after I had run all the code that I wanted, everything worked well.
通过消除这些并且在我运行了我想要的所有代码之后只调用它们,一切都运行良好。
#1
12
Modifying your code into the Lambda template worked for me. I think you need to assign a function to exports.handler
and call the appropriate context.succeed()
or context.fail()
method. Otherwise, you just get generic errors.
将代码修改为Lambda模板对我有用。我认为你需要为exports.handler分配一个函数,并调用相应的context.succeed()或context.fail()方法。否则,您只会得到一般错误。
var fs = require("fs");
exports.handler = function(event, context) {
fs.writeFile("/tmp/test.txt", "testing", function (err) {
if (err) {
context.fail("writeFile failed: " + err);
} else {
context.succeed("writeFile succeeded");
}
});
};
#2
7
So the answer lies in the context.fail()
or context.succeed()
functions. Being completely new to the world of aws and lambda I was ignorant to the fact that calling any of these methods stops execution of the lambda instance.
所以答案在于context.fail()或context.succeed()函数。作为aws和lambda世界的全新,我对于调用这些方法中的任何一个停止执行lambda实例这一事实一无所知。
According to the docs:
根据文件:
The context.succeed() method signals successful execution and returns a string.
context.succeed()方法表示成功执行并返回一个字符串。
By eliminating these and only calling them after I had run all the code that I wanted, everything worked well.
通过消除这些并且在我运行了我想要的所有代码之后只调用它们,一切都运行良好。