Как настроить несколько функций Lambda для публикации sh в SNS topi c, если обнаружена какая-либо ошибка или сбой вызова? - PullRequest
0 голосов
/ 14 апреля 2020

Я пробовал несколько вещей:

  • SNS Topi c в качестве места назначения сбоя для лямбды (это не работает, потому что лямбды запускаются через синхронные события, такие как SQS, SNS или запланированное событие CloudWatch.
  • Сигналы тревоги CloudWatch (кажется, они действительно больше для агрегирования данных, а не для предупреждений об отдельных ошибках)
  • Создание лямбды, которая подписывается на группу журналов CloudWatch ( кажется, мне нужно было бы создать один из них для каждой лямбда-функции)

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

1 Ответ

0 голосов
/ 15 апреля 2020

Мое зависание состояло в том, что я хотел найти единственный метод захвата любого ОШИБКИ совпадения с шаблоном во всех связанных с лямбдой журналах CloudWatch и получить немедленное уведомление об этом. Подобные вещи вы бы настроили в LogDNA или LogEntries просто через их пользовательский интерфейс. Мне не понравилась идея настроить отдельные лямбды для подписки на логи других лямбд, потому что я думал, что это будет излишним. Я задумался над этим.

Лучший способ сделать это - создать лямбду, которая запускается журналами CloudWatch и преднамеренно подписывается на группы журналов и шаблоны, которые ему небезразличны. Вот общий пример c:

enter image description here

Это легко сделать в шаблоне 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;
};
...