Kinesis Lambda源转换:数据属性未经过base64编码

问题描述

我在Kinesis中有一个日志流,在将其发送到我们的日志监视服务之前,我尝试对其进行转换。正在发送的数据是JSON数组,我想将单个对象从数组中拉出,然后将该对象发送到日志监视服务。

documentation说日志数据是base64编码的,但是我解码它的努力失败了。

下面的代码是我用来转换数据的代码

const parseData = (data) => {
 
  // Attempt to base64 decode the data

  // This doesn't decode the string into recognisable characters.
  const dataString = dataString = Buffer.from(data,'base64').toString('ascii')
  
  // Attempt to parse the base64 decoded data as JSON
  const parsedData = JSON.parse(dataString)[0]
  
  return Buffer.from(JSON.stringify(parsedData)).toString('base64')
}

exports.handler = async (event,context) => {
    const output = event.records.map((record) => ({
        recordId: record.recordId,result: 'Ok',data: parseData(record),}));
    console.log(`Processing completed.  Successful records ${output.length}.`);
    return { records: output };
};

示例event.record

{ 
  recordId: '...',approximateArrivalTimestamp: 123,data: 'H4sIAAAAAAAAAG1STY/TMBD9K5GvxKmdtkuaVSW+ynJgOZUDQqhy7WljNrGN7UQpK/4746Yte0DKYfLm4715nu/PZKeNgpHUREgJIdcslYyyis45ycmbqDsIUXSO1Hy5qqpFtcL8apGTxoaIXdpRzvDjlN8xWs4ZdgnnWi1F1NZghWvFiQqnMQFm0N6aDkxqVTAgNoAPUyEvWIGj+GtOoWJCLdVBCkY7ESJ4rOwgNlZh4cNmi7+9bzGeCRl7Ea2fNSDa2GDiVw/+REP02hyxAhHcIPaB1CVjKKIVLociaTXaIcpxVkCG2vRtm5P9KUKg4ayRL3PiobMRqFDKoz9JJytw34Ivq4LfJZf8uEvmuUjBSKsm2uNv7fJM2s6lNlBTnbTGgLw4I1sbYMIvbl5H37ECraxX+BhTpgmk4jgZt/n8jn46b/u+AfkEflYWyfc47kZ68AL3si5xJLUfNL++TTkpZAMUFURvk3XG0jOUZxgFtBCjToyJZs0w7EOkHgbRaiuiXOenfpRB48m9pDE2GH04XJj+tyXizotjJ15QTzCMTqNJiN+2GPESnUffr1P4fdZZBet9a+XTVHVWVZNHa/JszrO3/TFLx5uxRb3g9aLMHh63Nz03zenS/93nbDCqCC6dCt1bG4vrORVD+epnsOZeNsIHIoUv24+0In9+/AUluUgIMwMAAA==',kinesisRecordMetadata: { 
    sequenceNumber: '...',subsequenceNumber: 0,partitionKey: '...',shardId: '...',approximateArrivalTimestamp: 123 
  } 
}

当我尝试使用下面的代码对上述data值进行base64解码时,输出乱码:

const data = 'H4sIAAAAAAAAAG1STY/TMBD9K5GvxKmdtkuaVSW+ynJgOZUDQqhy7WljNrGN7UQpK/4746Yte0DKYfLm4715nu/PZKeNgpHUREgJIdcslYyyis45ycmbqDsIUXSO1Hy5qqpFtcL8apGTxoaIXdpRzvDjlN8xWs4ZdgnnWi1F1NZghWvFiQqnMQFm0N6aDkxqVTAgNoAPUyEvWIGj+GtOoWJCLdVBCkY7ESJ4rOwgNlZh4cNmi7+9bzGeCRl7Ea2fNSDa2GDiVw/+REP02hyxAhHcIPaB1CVjKKIVLociaTXaIcpxVkCG2vRtm5P9KUKg4ayRL3PiobMRqFDKoz9JJytw34Ivq4LfJZf8uEvmuUjBSKsm2uNv7fJM2s6lNlBTnbTGgLw4I1sbYMIvbl5H37ECraxX+BhTpgmk4jgZt/n8jn46b/u+AfkEflYWyfc47kZ68AL3si5xJLUfNL++TTkpZAMUFURvk3XG0jOUZxgFtBCjToyJZs0w7EOkHgbRaiuiXOenfpRB48m9pDE2GH04XJj+tyXizotjJ15QTzCMTqNJiN+2GPESnUffr1P4fdZZBet9a+XTVHVWVZNHa/JszrO3/TFLx5uxRb3g9aLMHh63Nz03zenS/93nbDCqCC6dCt1bG4vrORVD+epnsOZeNsIHIoUv24+0In9+/AUluUgIMwMAAA=='

console.log(Buffer.from(data,'base64').toString('ascii'))

输出

TDH+~;c&!P@Jarfc=yoOd'mic61
          2
N9IQtT|9**E5B|j]ZQNpc_1ZNv      gZ-ETV`kE
'1fP^LjU0 6S!/X#xkN!bB-UA
F;"x,l 6VaaCf
             ?=o1       {-5 ZX`bW~DCtZ1\ vT%c("."i5Z!JqV@Ztm)B a,/sb!3(PJ#?I'+p_/+_%|8Kf9HAH+&ZcomrLZN%6PS4F<8#[B/n^G_1-,WxS>   $b87y|~:o{>y~VIw8nFzpw2.q$56_>M9)dDouFR3g4#N
                                        fM0lC$Qj%"\g'~AcI=$16}8\~7%bN
                                                                     c'^PO0
                                                                           N#_6qG_/Sx}VYk}keSTuVUGkrlN37}1KGE=`u"L77=7MiR]gl0.
][

问题

在这里做错了什么?我应该用另一种方式来解码这些值吗?

解决方法

数据已压缩。一个有效的例子:

const zlib = require('zlib');
const data = 'H4s... etc';
const compressed = Buffer.from(data,'base64');
const decompressed = zlib.unzipSync(compressed);
console.log(decompressed.toString());