Node.js中的代码AWS Lambda Package不会调用putRecord()来将数据添加到AWS Kinesis Firehose Stream中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js中的代码AWS Lambda Package不会调用putRecord()来将数据添加到AWS Kinesis Firehose Stream中相关的知识,希望对你有一定的参考价值。
我已经构建了一个AWS Lambda部署包(使用Node.js),当对象进入指定的S3存储桶时执行该包。我已经将执行的代码配置为,现在,将10个随机生成的记录添加到Kinesis Firehose流中。
除了将记录添加到Kinesis流中之外,Lambda函数的工作正常。我在AWS CloudWatch日志中看不到任何错误消息。使用console.log()打印语句,似乎putRecord()调用甚至没有执行,我无法弄清楚原因。其他人可以解决这个问题吗?
这是我的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");
}
});
};
这是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"
附:我有一个与Lambda函数关联的IAM角色,该角色配置了从S3读取的策略以及写入Kinesis。
当我尝试执行listStreams()时,我发现了问题。它只打印出Kinesis流,而不是Firehose Streams。我曾经认为,在API中,Firehose属于Kinesis保护伞。然而,Firehose是它自己独立的API。
另外,我遇到了另一个问题,这里有一个解决方法:Running AWS Firehose in lambda.js gives an undefined error。目前,如果您将Firehose API与Lambda一起使用,则需要在Lambda函数部署包中包含aws-sdk模块(npm install aws-sdk)。显然有一张为亚马逊创建的票证来解决这个问题。
以上是关于Node.js中的代码AWS Lambda Package不会调用putRecord()来将数据添加到AWS Kinesis Firehose Stream中的主要内容,如果未能解决你的问题,请参考以下文章
如何从 AWS lambda 发布到 Node.js 中的云观察指标
使用 aws lambda node js 获取存储在 s3 存储桶中的视频的视频元数据
AWS lambda 调用不调用另一个 lambda 函数 - Node.js
AWS Lambda Cryptic Node.js 错误:发生未知应用程序错误