amazon-web-services – 将匹配模式的Cloudwatch日志发送到SQS队列

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

但是我在尝试的最初阶段就陷入困境:我首先尝试实现最基本的任务:将我的lambda执行时写的所有cloudwatch日志(通过放置在lambda函数中的console.logs)发送到SQS(为什么?因为我首先尝试制作最简单的东西,然后通过过滤哪个日志发送以及哪个日志不发送来进行复杂化.

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

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

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

但是当我触发例如我的lambdas时,它们确实出现在Cloudwatch日志中,因此我希望将日志内容“发送”到队列中,但是当我轮询/检查队列内容时,SQ上没有任何内容可见.

我对云观察规则有什么误解吗?

背景说明

我有lambdas,每小时大规模触发(在我的规模:)与1或2分钟内可能300至500次执行lambda.
我想监视Slack所有的console.logs(我正在记录真正的error.stack javascript消息以及纯粹的信息性消息,例如lambda输出的结果“lambda的报告卡:公司= Apple,location = cupertino .. “).

我可以在每个lambda上使用对Slack的http调用但是Slack for incoming hooks has a limit of about 1 request per second,之后如果你试图每秒发送超过1个传入的webhook你会得到429个错误…所以我想我需要使用队列以便我没有300个lambdas在同一秒写入Slack,而是在一个名为slackQueue的集中队列中控制从AWS到Slack的流程.

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

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

关于一些评论:我不想使用我的理解(不是AWS专家)云计算警报或指标过滤器,因为它们非常昂贵(我每小时触发数百次)并且不要t实际上符合我的需要:我不想仅在发生严重问题或“问题”时(例如CPU> xxx …)阅读Slack,而是真正发送“几乎”所有日志的常规过滤流Slack读取Slack内部的日志而不是AWS内部的日志,因为Slack是一整天打开的工具,它被用于来自除AWS之外的其他来源的日志/消息作为集中的地方,而且相当松弛的Slack附件消息格式化更好消化被我们.当然最后的lambda(将消息发送到slack的那个)会做一些格式化以添加斜体/粗体等等,并且松弛所需的markdown具有格式良好的“Slack attachements”但这不是最复杂的问题这里 :)

最佳答案 @Mathieu,我猜你用CloudWatch日志稍微误解了CloudWatch Events.

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

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

解决方案#1:

使用Subscription过滤器根据需要过滤掉日志,并订阅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.

点赞