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

时间:2018-11-12 22:02:22

标签: amazon-web-services aws-lambda aws-sdk amazon-sqs

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

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

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

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

作为目标,我选择了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 for incoming hooks has a limit of about 1 request per second,如果尝试每秒发送1个以上的传入Webhook,则会收到429个错误……所以我认为我需要使用队列,这样我就不会在同一秒内有300多个lambda写入Slack,而是在一个称为slackQueue的集中队列中控制从AWS到Slack的流量。

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

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

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

1 个答案:

答案 0 :(得分:1)

@Mathieu,我想您对CloudWatch事件和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。