使用AWS Lambda中的AWS S3服务调用正确处理context.succeed()/ context.fail()

时间:2015-04-28 22:22:39

标签: node.js asynchronous amazon-web-services amazon-s3 aws-lambda

我已经在这里搜索了帖子(即How do you structure sequential AWS service calls within lambda given all the calls are asynchronous?)和其他地方,但似乎无法找到一些可以帮助我克服这个烦人问题的信息。 当你有一个遍历循环的Lambda函数,并且在该循环内调用s3.putObject()时,它在尝试正确处理context.succeed()/ context.fail时会遇到短路问题()或旧的context.done(null,' msg')关闭Lambda进程的方法。

即。迭代需要使用要上载的当前对象调用s3.putObject(),但仍然将成功上传的文件输出到cloudwatch或SQS / SNS。但是,我将这种类型的闭包放入函数的所有尝试都会遇到有时获取文件名的随机结果,有时只会得到一些文件名等。

最好的方法是什么?我试图使用Q和异步,但说实话,我还在学习所有这些东西..

以下是我试图做的一个粗略的例子:

function output(s3Object){
     s3.putObject(s3Object, function(err, data){
          if (err) {
               console.log('There was an issue with outputting the object.', err);
          } else {
             // how do you properly close this if you have x number of incoming calls??
          // context.done(null, 'success');
}


// and later in the code where it actually calls the output function
// and NOTE: it should output all of the file names that the invocation uploads!
for (var a = 0; a < myRecords.length; a++){
     output(myRecords[a]);
}

但是,正如我之前所说,到目前为止我所做的任何尝试都会产生不同的结果。

Successfully output object: myBucket/prefix/part_000000123432345.dat
Successfully output object: myBucket/prefix/part_000000123432346.dat

但功能输出的另一个测试:

Successfully output object: myBucket/prefix/part_000000123432346.dat

哎呀。

1 个答案:

答案 0 :(得分:3)

我将使用Async给出一个简单的例子,然后你可以调整它:

mydrawer

这里我定义了一个var async = require('async'); var sleep = function(message, callback) { setTimeout(function() { callback(null, "Echo: " + message); }, Math.floor(Math.random() * 2000)); }; exports.handler = function(event, context) { async.map(['a', 'b', 'c', 'd', 'e'], sleep, context.done); }; 函数,它接受一个消息和回调,然后在0到2秒之间休眠一段随机时间,然后将消息回显给回调。

然后我们使用sleep()在5条不同的消息上异步调用async.map()函数。每the docs,当所有迭代器函数完成时,将调用此函数的回调,在本例中为sleep()。在Lambda控制台中运行它,当然,你得到:

context.done

所以你的代码可能很简单:

[
  "Echo: a",
  "Echo: b",
  "Echo: c",
  "Echo: d",
  "Echo: e"
]

但由于我无法对此进行测试,我会将该部分留给您。