2016-01-26 37 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

相關問題