Amazon web services 亚马逊弹性转码器,如何等待作业完成?

Amazon web services 亚马逊弹性转码器,如何等待作业完成?,amazon-web-services,amazon-s3,aws-lambda,amazon-elastic-transcoder,Amazon Web Services,Amazon S3,Aws Lambda,Amazon Elastic Transcoder,我有一个node.jslambda,在S3事件中触发。弹性转码器作业的启动方式如下: 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, callb

我有一个
node.js
lambda
,在
S3
事件中触发。
弹性转码器
作业的启动方式如下:

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);
                }
            });
        }   
    });
};
转码过程
超时

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次(lambda的三次尝试?)


我肯定我遗漏了什么,有人能指出错误吗?

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


在你的两次重试猜测中,你是正确的。如果AWS Lambda无法完全处理异步事件,则它将自动重试调用两次,两次重试之间会有延迟。

这比所有“Duh”时刻都要好。曾经请注意,您在这里等待转码作业完成,从而为Lambda支付了不必要的费用。如果超过Lambda超时,您还将面临不必要的重试风险(这也需要花费金钱)。不必等待转码作业完成,您可以简单地退出(如果您不关心转码结果),或者您可以让弹性转码器在转码作业完成时发送SNS通知(该通知可以在作业完成时调用第二个Lambda函数来执行所需的任何操作)。