Расшифровка фильтров подписки на журнал AWS CloudWatch - PullRequest
0 голосов
/ 14 мая 2018

Я использую поток фильтров подписки журнала CloudWatch в Lambda и публикую сообщение в теме SNS.Но он выведет искаженное сообщение и не сможет успешно расшифровать.

мой вывод:

k
%"
 jVbB

Если не декодировать, будет выведено так:

{ "awslogs": {"data": "BASE64ENCODED_GZIP_COMPRESSED_DATA"} }

Мой кодниже и использует nodejs:

console.log("Loading function");
var AWS = require("aws-sdk");

exports.handler = function(event, context) {
    var eventText = JSON.stringify(event, null, 2);
    var decodeText = new Buffer(eventText, 'base64').toString('ascii');
    console.log("Received event:", eventText);
    var sns = new AWS.SNS();
    var params = {
        Message: decodeText, 
        Subject: "Test SNS From Lambda",
        TopicArn: "arn:aws:sns:region:account:snsTopic"
    };
    sns.publish(params, context.done);
};

1 Ответ

0 голосов
/ 06 сентября 2018

CloudWatch Журналы доставляются в подписанную функцию Lambda в виде списка, сжатого gzip и закодированного в base64.

Вот пример того, как декодировать и распаковать список журналов:

const zlib = require('zlib');

exports.handler = async (event) => {
  if (event.awslogs && event.awslogs.data) {
    const payload = Buffer.from(event.awslogs.data, 'base64');

    const logevents = JSON.parse(zlib.unzipSync(payload).toString()).logEvents;

    for (const logevent of logevents) {
      const log = JSON.parse(logevent.message);
      console.log(log);
    }
  }
};
...