Если несколько журналов соответствуют фильтру во время лямбда-вызова, лямбда будет выполняться только один раз, но все журналы будут включены во входные данные. В вашей лямбде 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( );
}
};