Мое зависание состояло в том, что я хотел найти единственный метод захвата любого ОШИБКИ совпадения с шаблоном во всех связанных с лямбдой журналах CloudWatch и получить немедленное уведомление об этом. Подобные вещи вы бы настроили в LogDNA или LogEntries просто через их пользовательский интерфейс. Мне не понравилась идея настроить отдельные лямбды для подписки на логи других лямбд, потому что я думал, что это будет излишним. Я задумался над этим.
Лучший способ сделать это - создать лямбду, которая запускается журналами CloudWatch и преднамеренно подписывается на группы журналов и шаблоны, которые ему небезразличны. Вот общий пример c:
Это легко сделать в шаблоне CloudFormation (или в любом другом формате), например:
Resources:
CloudWatchLogProcessorFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: CloudWatchLogProcessor
...
Events:
Foo:
Type: CloudWatchLogs
Properties:
LogGroupName: /aws/lambda/Foo
FilterPattern: ERROR
Bar:
Type: CloudWatchLogs
Properties:
LogGroupName: /aws/lambda/Bar
FilterPattern: ERROR
Baz:
Type: CloudWatchLogs
Properties:
LogGroupName: /aws/lambda/Baz
FilterPattern: ERROR
Bof:
Type: CloudWatchLogs
Properties:
LogGroupName: /aws/lambda/Bof
FilterPattern: ERROR
Затем вы можете заставить эту лямбду выполнять крошечную задачу по декодированию журнала и делать с результатами все, что вы хотите, например, опубликовать сообщение, содержащее группу журналов и записи журнала, в топику SNS c:
const AWS = require('aws-sdk');
const zlib = require('zlib');
const sns = new AWS.SNS();
exports.handler = async (event) => {
if (!event.awslogs || !event.awslogs.data) {
throw new Error("Unexpected event.");
}
const payload = Buffer.from(event.awslogs.data, 'base64');
const log = JSON.parse(zlib.unzipSync(payload).toString());
let msg = '';
msg += `Log Group: ${log.logGroup}\n`;
msg += `Log Stream: ${log.logStream}\n\n`;
log.logEvents.forEach(e => {
msg += `${e.message}\n\n`;
});
await sns.publish({
Message: msg,
TopicArn: process.env.SNS_TOPIC_ARN
}).promise();
return null;
};