但是,在我的尝试中,我卡在了最开始的地方:我首先尝试实现最基本的任务:将在执行我的Lambda时编写的所有cloudwatch日志(通过放置在lambda函数内部的console.logs)消息发送到SQS(为什么?因为我首先尝试做最简单的事情,然后再复杂化过滤要发送的日志和不发送的日志)。
因此,我创建了一个Cloudwatch规则>事件>事件模式,如下所示:
{
"source": [
"aws.logs"
]
}
作为目标,我选择了SQS,然后选择了一个我创建的队列。
但是,当我触发我的lambda函数时,它们出现在Cloudwatch日志中,所以我本来希望日志内容被“发送”到队列中,但是当我轮询/检查队列内容时,在SQS上没有任何可见内容。
我是否对Cloudwatch规则有什么误解?
背景说明:
我的lambda每小时会大量触发(在我的规模下可能是每1或2分钟执行300到500次)。
我想在Slack上监控它们的console.logs(我记录了真正的error.stack JavaScript消息以及纯粹信息性的消息,如lambda输出的结果“公司的报告卡:苹果公司,地点:cupertino...”)。
我可以在每个lambda上使用http调用到Slack,但是Slack的传入钩子每秒只能请求1个,如果您尝试每秒发送多个收件箱webhook,则会收到429错误。因此,我认为需要使用队列,这样我就不需要300多个lambda在同一秒写入Slack,而是在名为slackQueue的集中队列中控制从AWS到Slack的流程。
我的想法是将某些日志(请参见下文)从Cloudwatch发送到SQS slackQueue,然后使用此SQS队列作为lambda触发器,并使用此lambda将10条消息(AWS允许的最大值;对我来说,每个消息= 1个console.log)通过连接成一个大字符串或数组(无论哪种方式)发送到我的Slack频道(顺便说一句,您可以将100条Slack消息连接并在一次调用中发送,基于Slack限制,因此如果我可以处理100条消息= console.log并连接,我会这样做,但是当前批处理大小限制为10 AWS I think),从而确保我不会向Slack发送超过1个“请求”(此请求具有10个console.logs的内容)。
当我在上面说“某些日志”时,实际上我不希望将所有日志发送到队列中(因为我不想在Slack上看到它们):实际上,我不想要纯粹“调试”的消息,例如
console.log(“输入函数foo”)
,这些消息在开发期间非常有用,但与Slack无关。关于一些评论:我不想使用CloudWatch警报或度量过滤器,因为它们非常昂贵(每小时会触发数百次),并且实际上并不符合我的需求:我不仅想在Slack上阅读关键问题或“问题”发生时的信息(例如CPU> xxx...),而是真正地将“几乎”所有日志的经过筛选的流发送到Slack,以便在Slack中阅读日志,而不是在AWS中阅读。因为Slack是全天开放的工具,用于来自其他来源而不仅仅是AWS的日志/消息的集中地,并且漂亮的Slack附件消息格式更易于我们消化。当然,最终的lambda函数(将消息发送到Slack)会进行一些格式化操作,以添加斜体/粗体等Markdown,以便拥有漂亮格式的“Slack附件”,但这不是最复杂的问题 :)