Отправка журналов Cloudwatch, соответствующих шаблону, в очередь SQS - PullRequest
0 голосов
/ 13 ноября 2018

Я хотел бы отправить все журналы Cloudwatch, где сообщение console.log (появляющееся в моих журналах Cloudwatch) соответствует определенному шаблону (например, включая слово «postToSlack», или имеющему определенное поле json, например «slack»): правда»...)

Но я застрял в самом начале своих попыток: сначала я пытаюсь реализовать самую основную задачу: отправить ВСЕ журналы облачных часов, записанные, когда выполняются мои лямбды (через console.logs, размещенные внутри функций лямбды) SQS (почему? Потому что я сначала пытаюсь сделать простейшую вещь, прежде чем сложить с фильтрацией, какой журнал отправлять, а какой - не отправлять).

Итак, я создал Правила Cloudwatch> Событие> Шаблон события, как показано ниже:

{
  "source": [
    "aws.logs"
  ]
}

и в качестве цели я выбрал SQS, а затем очередь, которую создал.

Но когда я запускаю, например, свои лямбды, они появляются в журналах Cloudwatch, поэтому я ожидал, что содержимое журнала будет «отправлено» в очередь, но ничего не видно в SQ при опросе / проверке содержимого очередь.

Есть ли что-то, что я неправильно понимаю в правилах CloudWatch?

ОБЪЯСНЕНИЕ КОНТЕКСТА

У меня есть лямбды, которые каждый час массово срабатывают (в моем масштабе :), примерно от 300 до 500 казней за 1 или 2 минуты. Я хочу отслеживать на Slack все их console.logs (я регистрирую реальные сообщения об ошибках error.stack javascript, а также чисто информативные сообщения, такие как результат вывода лямбды "Отчетная карточка лямбды: company = Apple, location = cupertino .. ".).

Я мог бы просто использовать http-вызов Slack для каждой лямбды, но Slack для входящих ловушек имеет ограничение около 1 запроса в секунду , после этого вы получаете 429 ошибок, если вы пытаетесь отправить более 1 входящий webhook в секунду ... Итак, я подумал, что мне нужно использовать очередь, чтобы у меня не было более 300 лямбд, записывающих в Slack в одну секунду, а вместо этого управлял потоком из AWS в Slack в централизованной очереди с именем slackQueue.

Моя идея состоит в том, чтобы отправить определенные журналы (см. Ниже) из Cloudwatch в SQS slackQueue, а затем использовать эту очередь SQS в качестве лямбда-триггера и отправлять с этим лямбда-пакетами 10 сообщений (максимум, разрешенный AWS; для меня 1 message = 1 console.log) объединяется в одну большую строку или массив (что угодно) для отправки его на мой канал Slack (кстати, вы можете объединить и отправить за один вызов до 100 сообщений Slack на основе ограничений Slack, поэтому, если я смогу обработать 100 сообщений = console.log и объединение Я бы хотел, но текущий предел размера пакета для AWS, я думаю, равен 10), таким образом, гарантируя, что я не отправляю более 1 «запроса» в секунду в Slack (этот запрос имеет содержимое 10 console.logs).

Когда я говорю выше "определенные журналы", это означает, что я фактически не хочу, чтобы ВСЕ журналы отправлялись в очередь (потому что я не хочу их в Slack): на самом деле я не хочу чисто «отладочные» сообщения типа console.log("entered function foo")., которые полезны во время разработки, но не имеют отношения к Slack.

Что касается некоторых комментариев: я не хочу использовать, насколько я понимаю (не эксперт по AWS), сигналы тревоги облачных часов или фильтры метрик, потому что они довольно дорогие (я бы их срабатывал сотни раз в час) и на самом деле не соответствует моим потребностям: я не хочу читать на Slack только тогда, когда возникает критическая проблема или «проблема» (например, CPU> xxx ...), но действительно отправлять регулярные отфильтрованные поток «почти» всех моих журналов в Slack для чтения журналов внутри Slack, а не внутри AWS, поскольку Slack - это инструмент, открытый весь день, который используется для централизованного размещения журналов / сообщений, поступающих из других источников, кроме AWS, и что красивое форматирование сообщений вложения Slack лучше усваивается нами. Конечно, последняя лямбда (та, которая отправляет сообщения в slack) будет делать небольшое форматирование, чтобы добавить курсив / полужирный / и т. Д., А также уценку, необходимую для slack, чтобы красиво отформатировать «Slack attachments», но это не самая сложная проблема. здесь :) 1031 *

1 Ответ

0 голосов
/ 22 ноября 2018

@ Матье, я думаю, вы неправильно поняли события CloudWatch с журналами CloudWatch.

Что вам нужно, так это обработка в реальном времени данных журнала, сгенерированных вашими лямбда-функциями, фильтрация журналов на основе шаблона, а затем сохранение этих отфильтрованных журналов в Slack для анализа.

Но настройка события CloudWatch с помощью SQS аналогична триггеру SQS для Lambda. Здесь cloudWatch будет запускать (отправлять сообщение) очередь SQS. Содержимое сообщения - это не ваши журналы, а созданное вами сообщение по умолчанию или пользовательское сообщение.

Решение № 1:

Используйте фильтр подписки, чтобы отфильтровать журналы в соответствии с требованиями и подписаться на AWS Kinesis / AWS Lambda / Amazon Kinesis Data Firehouse. Используя отфильтрованный поток (Kinesis), запустите лямбду, чтобы передать эти данные в Slack.

https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Subscriptions.html https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html

Решение № 2:

  • Переместите ваши журналы cloudWatch на S3.
  • Создайте событие уведомления в S3 для события «ObjectCreated» и используйте его для запуска функции Lambda.
  • В вашей лямбда-функции напишите логику для чтения журналов из S3 (эквивалентно чтению файла), отфильтруйте их и отправьте отфильтрованные журналы в Slack.
...