Как отправить электронное письмо SNS из Lambda несколько раз, когда оно находит одно и то же слово в cloudwatch? - PullRequest
0 голосов
/ 20 ноября 2019

Я создал лямбда-функцию для отправки уведомления SNS каждый раз, когда оно соответствует определенному ключевому слову из журналов cloudwatch. Это шаблон фильтра, в котором срабатывает лямбда-функция

Единственная проблемаздесь лямбда отправляет почту только один раз, когда в логах cloudwatch найдено конкретное ключевое слово, даже если в логах есть похожие слова, повторяющиеся несколько раз. Я хочу, чтобы он отправлял почту SNS 5 раз, если он находит одно и то же слово 5 раз.

Пожалуйста, дайте мне знать, если это понятно.

Это вся моя лямбда-структура и Это лямбда-код

Благодарность! Код, который я использую, это python

1 Ответ

0 голосов
/ 20 ноября 2019

Если несколько журналов соответствуют фильтру во время лямбда-вызова, лямбда будет выполняться только один раз, но все журналы будут включены во входные данные. В вашей лямбде event.awslogs.data содержится сжатый JSON-файл в кодировке base64 со свойством logEvents, представляющим собой массив, длина которого равна числу журналов, соответствующих фильтру.

Если вы хотите опубликовать один раз для каждого журнала,вам нужно перебрать этот массив и опубликовать один раз в SNS для каждой записи журнала. В Node.js это будет выглядеть примерно так:

const util = require( 'util' );
const zlib = require( 'zlib' );
const AWS = require( 'aws-sdk' );

const gunzip = util.promisify( zlib.gunzip );
const sns = new AWS.SNS( );

exports.handler = async function ( event ) {
    const gzippedPayload = Buffer.from( event.awslogs.data, 'base64' );
    const payload = await gunzip( gzippedPayload );
    const { logEvents } = JSON.parse( payload.toString( 'utf8' ) );

    if ( ! logEvents )
      return;

    for ( const log of logEvents ) {
      await sns.publish( {
        TopicArn: process.env.SNS_TOPIC_ARN,
        Message: "if you get this message you can go back to sleep!",
      } ).promise( );
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...