0

J'ai créé un package de déploiement AWS Lambda (à l'aide de Node.js) qui s'exécute lorsqu'un objet est mis dans un Seau spécifié S3. J'ai configuré le code qui est exécuté pour, pour l'instant, ajouter 10 enregistrements générés de manière aléatoire dans un flux Kinesis Firehose.Le code dans Node.js Le package AWS Lambda n'appelle pas putRecord() pour ajouter des données dans AWS Kinesis Firehose Stream

La fonction Lambda fonctionne correctement, à l'exception de l'ajout des enregistrements dans le flux Kinesis. Je ne vois aucun message d'erreur dans les journaux AWS CloudWatch. En utilisant les instructions print de console.log(), il semble que l'appel de putRecord() ne s'exécute même pas et je n'arrive pas à comprendre pourquoi. Quelqu'un d'autre peut-il comprendre cela?

Voici le code qui est en dehors de mon package de déploiement de la fonction Lambda:

console.log('Loading function'); 

var aws = require('aws-sdk'); 
var s3 = new aws.S3({ apiVersion: '2006-03-01' }); 
var zlib = require('zlib'); 

function _writeToKinesis(kinesis) { 
    var currTime = new Date().getMilliseconds(); 
    var sensor = 'sensor-' + Math.floor(Math.random() * 100000); 
    var reading = Math.floor(Math.random() * 1000000); 

    var record = JSON.stringify({ 
     time : currTime, 
     sensor : sensor, 
     reading : reading 
    }); 

    console.log("record: " + record); 

    var recordParams = { 
     Data : record, 
     PartitionKey : sensor, 
     StreamName : "my_firehose" 
    }; 

    console.log("recordParams: " + recordParams); 

    kinesis.putRecord(recordParams, function(err, data) { 
     console.log("test"); 
     if (err) { 
     console.log(err); 
     } 
     else { 
     console.log('Successfully sent data to Kinesis.'); 
     } 
    }); 
} 

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 record = event.Records[0]; 
    var bucket = record.s3.bucket.name; 
    var key = record.s3.object.key; 
    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('CONTENT TYPE:', data.ContentType); 

      var kinesis = new aws.Kinesis({ apiVersion: '2013-12-02', region : "us-east-1"}); 

      var count = 0; 
      while (count < 10) { 
       setTimeout(_writeToKinesis(kinesis), 1000); 
       count++; 
      } 

      context.succeed("OK");    
     } 
    }); 
}; 

Et voici la sortie CloudWatch Log:

START RequestId: c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 Version: $LATEST 
2015-10-18T20:13:59.743Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 CONTENT TYPE: application/zip 
2015-10-18T20:13:59.861Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 record: {"time":860,"sensor":"sensor-12149","reading":146264} 
2015-10-18T20:13:59.861Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 recordParams: [object Object] 
2015-10-18T20:13:59.980Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 record: {"time":924,"sensor":"sensor-86345","reading":956735} 
2015-10-18T20:13:59.980Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 recordParams: [object Object] 
2015-10-18T20:13:59.982Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 record: {"time":982,"sensor":"sensor-4925","reading":822265} 
2015-10-18T20:13:59.982Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 recordParams: [object Object] 
2015-10-18T20:14:00.060Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 record: {"time":60,"sensor":"sensor-40822","reading":796150} 
2015-10-18T20:14:00.060Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 recordParams: [object Object] 
2015-10-18T20:14:00.061Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 record: {"time":61,"sensor":"sensor-92861","reading":855213} 
2015-10-18T20:14:00.061Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 recordParams: [object Object] 
2015-10-18T20:14:00.063Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 record: {"time":63,"sensor":"sensor-84324","reading":155159} 
2015-10-18T20:14:00.063Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 recordParams: [object Object] 
2015-10-18T20:14:00.121Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 record: {"time":121,"sensor":"sensor-54930","reading":365471} 
2015-10-18T20:14:00.121Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 recordParams: [object Object] 
2015-10-18T20:14:00.122Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 record: {"time":122,"sensor":"sensor-1330","reading":981637} 
2015-10-18T20:14:00.122Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 recordParams: [object Object] 
2015-10-18T20:14:00.123Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 record: {"time":123,"sensor":"sensor-92245","reading":634723} 
2015-10-18T20:14:00.123Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 recordParams: [object Object] 
2015-10-18T20:14:00.161Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 record: {"time":161,"sensor":"sensor-29594","reading":227706} 
2015-10-18T20:14:00.161Z c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 recordParams: [object Object] 
END RequestId: c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 
REPORT RequestId: c3f9e9d3-75d4-11e5-a597-f7dcab9cd666 Duration: 1258.07 ms Billed Duration: 1300 ms Memory Size: 128 MB Max Memory Used: 15 MB 

"OK" 

post-scriptum J'ai un rôle IAM associé à la fonction Lambda configurée avec des règles à lire depuis S3 et à écrire dans Kinesis.

+0

Je remarque que toutes les exécutions (pas toutes), la sortie du journal est différente et contient l'erreur suivante: [ResourceNotFoundException: Stream my_firehose sous le compte 8 ********** * pas trouvé.] Je ne sais pas pourquoi - le flux est créé et est ACTIVE ... – littleK

Répondre

0

J'ai trouvé le problème lorsque j'ai essayé d'exécuter un listStreams(). Il était seulement l'impression de flux Kinesis, pas Firehose Streams. J'avais supposé que, dans l'API, Firehose était sous l'égide de Kinesis. Firehose est sa propre API séparée, cependant.

En outre, j'ai rencontré un autre problème qui a une solution de contournement affichée ici: Running AWS Firehose in lambda.js gives an undefined error. Pour l'instant, si vous utilisez l'API Firehose avec Lambda, vous devez inclure les modules aws-sdk dans votre package de déploiement de la fonction Lambda (npm install aws-sdk). Il y a apparemment un ticket créé pour Amazon pour résoudre ce problème.