0

我有一个node.jslambda,在S3事件触发。一个Elastic Transcoder工作开始,像这样:Amazon ElasticTranscoder,如何等待工作完成?

let AWS = require('aws-sdk'); 
let s3 = new AWS.S3({apiVersion: '2012–09–25'}); 
let eltr = new AWS.ElasticTranscoder({apiVersion: '2012–09–25', region: 'us-west-2'}); 

exports.handler = (event, context, callback) => { 
    let pipelineId = 'keystone'; 
    let bucket = event.Records[0].s3.bucket.name; 
    let key = event.Records[0].s3.object.key; 

    let etParams = { 
     PipelineId: pipelineId, 
     Input: { 
      Key: key, 
      FrameRate: 'auto', 
      Resolution: 'auto', 
      AspectRatio: 'auto', 
      Interlaced: 'auto', 
      Container: 'auto' 
     }, 
     Outputs: [{ 
      Key: key, 
      PresetId: '1351620000001-000010' 
     }] 
    }; 

    eltr.createJob(etParams, function(err, data) { 
     if (err) { 
      console.log("ET error", err, err.stack); 
     } else { 
      console.log("Calling waitFor for Job Id:", data.Job.Id); 
      eltr.waitFor("jobComplete", {Id: data.Job.Id}, function(err, data) { 
       if (err) { 
        console.log("ET waitFor Error", err, err.stack); 
       } else { 
        console.log("ET Job finished", data, data.Job.Output.Key); 
       } 
      }); 
     } 
    }); 
}; 

transcoding过程times out

START RequestId: 82c0a1ce-5cf3-11e7-81aa-a3362402de83 Version: $LATEST 

2017-06-29T17:51:03.509Z 82c0a1ce-5cf3-11e7-81aa-a3362402de83 Creating Job { PipelineId: 'keystone', 
Input: 
{ Key: 'f04d62af47.mp4', 
FrameRate: 'auto', 
Resolution: 'auto', 
AspectRatio: 'auto', 
Interlaced: 'auto', 
Container: 'auto' }, 
Outputs: 
[ { Key: 'f04d62af47.mp4', 
PresetId: '1351620000001-000010' } ] } 

2017-06-29T17:51:04.829Z 82c0a1ce-5cf3-11e7-81aa-a3362402de83 Calling waitFor for Job Id: 1498758664450-jxhdlx 

END RequestId: 82c0a1ce-5cf3-11e7-81aa-a3362402de83 

REPORT RequestId: 82c0a1ce-5cf3-11e7-81aa-a3362402de83 Duration: 3001.65 ms Billed Duration: 3000 ms Memory Size: 128 MB Max Memory Used: 37 MB 

2017-06-29T17:51:06.260Z 82c0a1ce-5cf3-11e7-81aa-a3362402de83 Task timed out after 3.00 seconds 

以上日志输出重复3次(拉姆达的三次尝试?)

我敢肯定,我错过了一些东西,有谁能指出错误吗?

回答

0

所有对AWS Lambda的调用都必须在300秒内完成执行。默认超时时间为3秒,但您可以将超时设置为1到300秒之间的任何值。

并且在你的两次重试猜想中,你是对的。如果AWS Lambda无法完全处理异步事件,那么它将自动重试该调用两次,重试之间有延迟。

+0

这打败了所有'杜'时刻。永远! – kmansoor

+0

请注意,您在此处等待转码作业完成,从而不必要地支付Lambda。如果您超过Lambda超时,您也会冒不必要的重试(这也会花费金钱)。您可以直接退出(如果您不关心转码结果),也可以让Elastic Transcoder在完成时发送SNS通知(而该通知可以调用第二个Lambda),而不是等待转码作业完成。功能可以在作业完成时做任何事情)。 – jarmod