首页 > 解决方案 > 将与模式匹配的 Cloudwatch 日志发送到 SQS 队列

问题描述

我想发送所有 Cloudwatch 日志,其中 console.log 的消息(出现在我的 Cloudwatch 日志中)与特定模式匹配(例如,包括单词“postToSlack”,或具有特定 json 字段,如“slack:true”。 ..)

但我被困在我尝试的最开始:我首先尝试实现最基本的任务:将执行我的 lambda 时写入的所有 cloudwatch 日志(通过放置在 lambda 函数中的 console.logs)消息发送到 SQS(为什么? 因为我首先尝试做最简单的事情,然后再过滤要发送的日志和不发送的日志)。

所以我创建了一个 Cloudwatch 规则 > 事件 > 事件模式,如下所示:

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

作为目标,我选择了 SQS,然后选择了我创建的队列。

但是当我触发例如我的 lambdas 时,它们确实出现在 Cloudwatch 日志中,所以我希望日志内容被“发送”到队列,但是当我轮询/检查队列的内容时,SQ 上什么都看不到。

我对 cloudwatch 规则有什么误解吗?

背景解释

我有 lambdas,每小时都会大量触发(以我的规模:)在 1 或 2 分钟内执行 300 到 500 次 lambdas。我想在 Slack 上监控他们所有的 console.logs(我正在记录真正的 error.stack javascript 消息以及纯粹的信息性消息,例如 lambda 输出的结果“lambda 的报告卡:company=Apple,location=cupertino.. 。”)。

我可以在每个 lambda 上使用对 Slack 的 http 调用,但传入挂钩的 Slack 限制为每秒约 1 个请求,之后如果您尝试每秒发送超过 1 个传入 webhook,则会收到 429 错误......所以我以为我需要使用一个队列,这样我就不会同时有 300 多个 lambda 表达式写入 Slack,而是在一个名为 slackQueue 的集中队列中控制从 AWS 到 Slack 的流量。

我的想法是从 Cloudwatch 发送某些日志(见下文)到 SQS slackQueue,然后将此 SQS 队列用作 lambda 触发器并使用此 lambda 批次发送 10 条消息(AWS 允许的最大值;对我来说 1 条消息 = 1 console.log)连接成一个大字符串或数组(无论如何)以将其发送到我的 Slack 通道(顺便说一句,您可以根据 Slack 限制连接并在一次调用中发送最多 100 条松弛消息,所以如果我可以处理 100 条消息= console.log 并连接我会,但我认为 AWS 当前的批量大小限制是 10),这样可以确保我每秒向 Slack 发送的“请求”不超过 1 个(该请求的内容为 10 个 console.logs )。

当我在上面说“某些日志”时,实际上我不希望将所有日志都发送到队列中(因为我不希望它们在 Slack 上):确实我不希望纯粹的“调试”像 aconsole.log("entered function foo").这样的消息在开发过程中很有用,但与 Slack 无关。

至于一些评论:据我所知(不是 AWS 专家),我不想使用 cloudwatch 警报或指标过滤器,因为它们非常昂贵(我会每小时触发数百次)并且不要t 实际上符合我的需要:我不想只在出现严重问题或“问题”时才在 Slack 上阅读(例如 CPU> xxx ...),而是真正发送常规过滤将我的“几乎”所有日志流到 Slack 以读取 Slack 内部而不是 AWS 内部的日志,因为 Slack 是全天开放的工具,它被用于来自 AWS 以外的其他来源的日志/消息作为一个集中位置,并且我们可以更好地消化漂亮的 Slack 附件消息格式。当然,最终的 lambda(将消息发送到 slack)会进行一些格式化以添加斜体/粗体/等,以及 slack 所需的降价以很好地格式化“Slack 附件”,但这不是最复杂的问题这里 :)

标签: amazon-web-servicesaws-lambdaaws-sdkamazon-sqs

解决方案


@Mathieu,我猜您对 CloudWatch 事件与 CloudWatch 日志的理解略有不同。

您需要实时处理 lambda 函数生成的日志数据,根据模式过滤日志,然后将过滤后的日志存储到 Slack 以供分析。

但是使用 SQS 配置 CloudWatch 事件类似于 Lambda 的 SQS 触发器。在这里,cloudWatch 将触发(发送消息到)SQS 队列。消息的内容不是您的日志,而是您创建的默认或自定义消息。

解决方案#1:

使用订阅过滤器根据要求过滤掉日志并订阅 AWS Kinesis/AWS Lambda/Amazon Kinesis Data Firehouse。使用过滤后的流 (Kinesis),触发您的 lambda 以将该数据推送到 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 函数。
  • 在您的 Lambda 函数中,编写从 S3 读取日志的逻辑(相当于读取文件),过滤它们并将过滤后的日志推送到 Slack。

推荐阅读