AWS Kinesis Firehose ne répond pas à Lambda
Nov 05 2020
Voici le code Lambda:
const AWS = require('aws-sdk');
var firehose = new AWS.Firehose({ region: 'ap-southeast-2' });
exports.handler = async (event, context) => {
var params = {
DeliveryStreamName: 'TestStream',
Record: {
Data: 'test data'
}
};
console.log('params', params);
firehose.putRecord(params, function (err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log('Firehose Successful', data); // successful response
});
}
Et la politique est:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"firehose:DeleteDeliveryStream",
"firehose:PutRecord",
"firehose:PutRecordBatch",
"firehose:UpdateDestination"
],
"Resource": [
"arn:aws:firehose:ap-southeast-2:xxxxxxxxxxxxx:deliverystream/TestStream"
]
}
]
}
J'ai littéralement coupé tout le reste. Et la réponse que je vois dans cloudwatch est:
2020-11-05T18:08:17.564+13:00 START RequestId: 3bed96b1-54af-4b08-bc06-be3732bba9ea Version: $LATEST
2020-11-05T18:08:17.568+13:00 2020-11-05T05:08:17.567Z 3bed96b1-54af-4b08-bc06-be3732bba9ea INFO params { DeliveryStreamName: 'TestStream', Record: { Data: <Buffer 74 65 73 74 20 64 61 74 61> } }
2020-11-05T18:08:17.621+13:00 END RequestId: 3bed96b1-54af-4b08-bc06-be3732bba9ea
2020-11-05T18:08:17.621+13:00 REPORT RequestId: 3bed96b1-54af-4b08-bc06-be3732bba9ea Duration: 57.38 ms Billed Duration: 100 ms Memory Size: 960 MB Max Memory Used: 85 MB Init Duration: 399.22 ms
Ainsi, l'exécution atteint les lignes des tuyaux d'incendie, et les dépasse, sans rien faire ...
Réponses
1 Marcin Nov 05 2020 at 12:29
Puisque vous utilisez le gestionnaire asynchrone, je pense que le problème est que votre fonction se termine avant que le code Firehose ait une chance de s'exécuter.
Une façon de remédier à ce problème consiste à utiliser Promisecomme indiqué dans la documentation AWS . Par exemple:
const AWS = require('aws-sdk');
var firehose = new AWS.Firehose({ region: 'ap-southeast-2' });
exports.handler = async (event, context, callback) => {
const promise = new Promise(function(resolve, reject) {
var params = {
DeliveryStreamName: 'TestStream',
Record: {
Data: 'test data'
}
};
console.log('params', params);
firehose.putRecord(params, function (err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log('Firehose Successful', data); // successful response
});
})
return promise;
};
Les changements ci-dessus ne sont donnés qu'à titre d'exemple, il faudra donc probablement encore quelques ajustements.