Search code examples
amazon-web-servicesamazon-s3aws-lambdaamazon-elastic-transcoder

Amazon ElasticTranscoder, How to wait for job completion?


I have a node.js lambda , triggered on S3 event. An Elastic Transcoder job is initiated like so:

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);
                }
            });
        }   
    });
};

The transcoding process 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

The above log output is repeated 3 times (lambda's three tries?)

I'm sure I'm missing something, can anybody please point the mistake?


Solution

  • All calls made to AWS Lambda must complete execution within 300 seconds. The default timeout is 3 seconds, but you can set the timeout to any value between 1 and 300 seconds.

    And on your two retries conjecture, you are correct. If AWS Lambda is unable to fully process an asynchronous event then it will automatically retry the invocation twice, with delays between retries.