将与模式匹配的Cloudwatch日志发送到SQS队列

Mat*_*ieu 5 amazon-sqs amazon-web-services aws-sdk aws-lambda

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

但是我一直停留在尝试的最开始:我首先尝试执行最基本的任务:将执行lambda时编写的所有cloudwatch日志(通过放置在lambda函数中的console.logs)发送给SQS(为什么?,因为我先尝试做最简单的事情,然后再过滤发送的日志和不发送的日志。

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

{
  "source": [
    "aws.logs"
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

但是,当我触发例如lambda时,它们确实会出现在Cloudwatch日志中,因此我希望日志内容被“发送”到队列中,但是当我轮询/检查队列的内容时,SQ上看不到任何内容。

关于cloudwatch规则,我有什么误解吗?

上下文说明

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

我可以在每个lambda上使用Slack的http调用,但是传入钩子的Slack每秒大约有1个请求的限制,之后,如果您尝试每秒发送多个传入的Webhook,则会收到429个错误...所以我认为我需要使用一个队列,这样我才不会在同一秒内有300多个lambda写入Slack,而是在一个称为slackQueue的集中队列中控制从AWS到Slack的流。

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

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

关于一些评论:据我所知(我不是AWS专家),我不想使用cloudwatch警报或指标过滤器,因为它们价格昂贵(我每小时会触发数百次),而不会不能真正满足我的需要:我不希望仅在严重问题或出现“问题”(例如CPU> xxx ...)时才在Slack上阅读,而是真正发送定期过滤我的几乎所有日志都流向Slack,以读取Slack内部而不是AWS内部的日志,因为Slack是一整天都开放的工具,它用于处理来自AWS以外的其他来源的日志/消息作为集中位置,并且我们可以更好地理解漂亮的Slack附件消息格式。当然,最后一个lambda(将消息发送到slack的那个)会做一些格式化以添加斜体/粗体/等,并且slack要求markdown才能很好地格式化“ Slack Attachments”,但这不是最复杂的问题这里 :)

小智 4

@Mathieu,我想您稍微误解了 CloudWatch Events 和 CloudWatch 日志。

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

但使用 SQS 配置 CloudWatch Event 与 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。