我正在使用aws-sdk(版本2.1.8)从Kinesis获取记录。这是在节点Lambda函数内。尝试使用ShardIteratorType:AT_TIMESTAMP。我在params对象中提供了一个时间戳
const AWS = require("aws-sdk");
const kinesis = new AWS.Kinesis({ region: 'us-east-1' });
var params = {
ShardId: shard.ShardId, /* required */
ShardIteratorType: 'AT_TIMESTAMP', /* required */
StreamName: process.env.STREAM_NAME, /* required */
Timestamp: new Date(2017, 11, 08, 14, 32, 51)
};
kinesis.getShardIterator(params, function (err, data) {
if (err) {
return defer.reject(err);
}
defer.resolve(data);
});
但我收到此错误:意外密钥'时间戳'在params中找到。检查谷歌,SO和aws论坛,无济于事。我正在关注AWS的文档:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Kinesis.html#getShardIterator-property
以下是Lambda函数中使用getShardIterator
的日志2017-11-08T15:53:13.551Z ec3ef291-c49c-11e7-ad35-473206669891 SHARD
ITERATOR TYPE: AT_TIMESTAMP
2017-11-08T15:53:13.551Z ec3ef291-c49c-11e7-ad35-473206669891
TIMESTAMP: 2017-12-08T14:32:51.000Z
ShardIteratorTypes LATEST和TRIM_HORIZON正常工作。只有当我尝试使用AT_TIMESTAMP才会出现问题。
答案 0 :(得分:0)
我发现了发生了什么事。 aws-sdk采用Timestamp值并将其乘以1000.这是疯狂的 - 文档中没有提到它,它只是说明了
要从中开始读取的数据记录的时间戳。与shard迭代器类型AT_TIMESTAMP一起使用。时间戳是Unix纪元日期,精确度为毫秒
因此,使用此
时间戳:1510673368611
将失败,即使它是一个有效的时间戳(以毫秒为单位)。你必须除以1000
时间戳:1510673368.611
发现这真是令人生气。只需验证我发送的值,不要更改它,然后验证结果。或者,你知道,这就是在DOCS中发生这种情况。