2016-01-26 39 views
19

我尝试写入aws lambda实例的文件系统失败。 The docs say标准lambda实例在/tmp/处具有512mb的可用空间。然而,我的本地机器上运行下面的代码是不工作的拉姆达实例:如何写入aws 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!"); 
    }); 

在匿名的回调函数的代码是从来没有得到所谓的拉姆达实例。任何人都有这样的成功吗?非常感谢你的帮助。

这很有可能是一个相关的question。 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

我对aws-lambda的理解是,代码在响应某个“事件”时运行 - 是代码“响应”甚至被触发的“事件”? –

+0

@JaromandaX是的,这是正确的。该事件被成功解雇。这是一组更大的代码的一部分,它试图编写从S3获取的CSV文件,然后将其转换为Json并再次将其上传到另一个s3存储桶,以便可以通过另一个lambda实例将其导入到dynamoDB中。一切正常,但这一块...... – Rymnel

+1

你正在使用'console.log' - 是console.log输出以某种方式可用(我不使用aws-lambda这就是为什么我问) - 如果是这样,在执行fs.writeFile之前做一个console.log? –

回答

7

因此,答案在于context.fail()context.succeed()功能。对于aws和lambda世界来说,我是一个全新的人,对于调用任何这些方法stops execution of the lambda instance这个事实我一无所知。

根据该文档:

的context.succeed()方法的信号成功执行,并返回 一个字符串。

通过消除这些,只有在我运行了所有我想要的代码后才调用它们,一切运行良好。

10

将您的代码修改为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"); 
     } 
    }); 
}; 
+0

感谢您的建议。我修改了我的代码并包含更多的上下文,但仍然没有调用我的回调函数。我怀疑s3.getObject函数和我正在做的事情之间会有某种冲突。我在这里看到你的答案http://stackoverflow.com/questions/30927172/how-to-upload-an-object-into-s3-in-lambda,并怀疑它是否与我的问题无关。 – Rymnel

相关问题