将与模式匹配的 Cloudwatch 日志发送到 SQS 队列
Send Cloudwatch logs matching a pattern to SQS queue
我想发送所有 Cloudwatch 日志,其中 console.log 的消息(出现在我的 Cloudwatch 日志中)匹配特定模式(例如包含单词 "postToSlack",或具有特定的json 字段如 "slack:true"...)
但我在尝试的最开始就卡住了:我首先尝试执行最基本的任务:发送执行我的 lambda 时写入的所有 cloudwatch 日志(通过 console.logs 放置在lambda 函数)消息到 SQS(为什么?因为我首先尝试做最简单的事情,然后再通过过滤发送和不发送日志来复杂化)。
所以我创建了 Cloudwatch 规则 > 事件 > 事件模式,如下所示:
{
"source": [
"aws.logs"
]
}
作为目标,我选择了 SQS,然后选择了我创建的队列。
但是当我触发例如我的 lambda 时,它们确实出现在 Cloudwatch 日志中,所以我希望日志内容 "sent" 到队列但是当我 poll/check 队列的内容。
我对 cloudwatch 规则有什么误解吗?
上下文说明
我的 lambda 每小时都会大量触发(以我的规模:),在 1 或 2 分钟内可能会执行 300 到 500 次 lambda。
我想在 Slack 上监视他们所有的 console.log(我正在记录真实的 error.stack javascript 消息以及纯粹的信息性消息,例如 lambda 输出 "Report Card of the lambda: company=Apple, location=cupertino..." 的结果)。
我可以在每个 lambda 上使用对 Slack 的 http 调用,但是 Slack for incoming hooks has a limit of about 1 request per second,之后如果你尝试每秒发送超过 1 个传入的 webhook,你会得到 429 错误......所以我想我' d 需要使用一个队列,这样我就不会在同一秒内有 300 多个 lambda 表达式写入 Slack,而是在一个名为 slackQueue 的集中队列中控制从 AWS 到 Slack 的流量。
我的想法是将某些日志(见下文)从 Cloudwatch 发送到 SQS slackQueue,然后将此 SQS 队列用作 lambda 触发器并使用此 lambda 批次发送 10 条消息(AWS 允许的最大值;对于me 1 message= 1 console.log) 连接成一个大字符串或数组(无论什么)以将其发送到我的 Slack 频道(顺便说一句,您可以根据 Slack 限制连接并发送最多 100 条松弛消息,所以如果我可以处理 100 条消息=console.log 并连接我会,但我认为 AWS 的当前批量大小限制是 10),这样,确保我每秒发送的消息不超过 1 "request" 到 Slack (这个请求有10console.logs的内容)。
当我在上面说 "certain logs" 时,它的意思是,实际上我不希望将所有日志发送到队列(因为我不希望它们出现在 Slack 上):确实我不希望想要纯粹的 "debugging" 消息,例如 console.log("entered function foo").
,它们在开发过程中很有用,但与 Slack 无关。
关于一些评论:据我了解(不是 AWS 专家),我不想使用 cloudwatch 警报或指标过滤器,因为它们非常昂贵(我每次都会触发数百次小时)并且实际上不符合我的需要:我不想只在严重问题或 "problem" 发生时才在 Slack 上阅读(比如 CPU> xxx ...),但真的发送filtered 我所有日志的 "almost" 流到 Slack 以读取 Slack 内部而不是 AWS 内部的日志,因为 Slack 是整天打开的工具,它被用于 logs/messages 来自其他来源而不是 AWS 作为一个集中的地方,我们更好地消化了漂亮的 Slack 附件消息格式。当然,最后的 lambda(将消息发送到 slack 的那个)会进行一些格式化以添加 italic/bold/etc.,而 slack 需要 markdown 才能很好地格式化 "Slack attachements" 但这并不是最复杂的问题在这里 :)
@Mathieu,我猜你对 CloudWatch Events with CloudWatch logs 有一点误解。
您需要的是实时处理您的 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。
我想发送所有 Cloudwatch 日志,其中 console.log 的消息(出现在我的 Cloudwatch 日志中)匹配特定模式(例如包含单词 "postToSlack",或具有特定的json 字段如 "slack:true"...)
但我在尝试的最开始就卡住了:我首先尝试执行最基本的任务:发送执行我的 lambda 时写入的所有 cloudwatch 日志(通过 console.logs 放置在lambda 函数)消息到 SQS(为什么?因为我首先尝试做最简单的事情,然后再通过过滤发送和不发送日志来复杂化)。
所以我创建了 Cloudwatch 规则 > 事件 > 事件模式,如下所示:
{
"source": [
"aws.logs"
]
}
作为目标,我选择了 SQS,然后选择了我创建的队列。
但是当我触发例如我的 lambda 时,它们确实出现在 Cloudwatch 日志中,所以我希望日志内容 "sent" 到队列但是当我 poll/check 队列的内容。
我对 cloudwatch 规则有什么误解吗?
上下文说明
我的 lambda 每小时都会大量触发(以我的规模:),在 1 或 2 分钟内可能会执行 300 到 500 次 lambda。 我想在 Slack 上监视他们所有的 console.log(我正在记录真实的 error.stack javascript 消息以及纯粹的信息性消息,例如 lambda 输出 "Report Card of the lambda: company=Apple, location=cupertino..." 的结果)。
我可以在每个 lambda 上使用对 Slack 的 http 调用,但是 Slack for incoming hooks has a limit of about 1 request per second,之后如果你尝试每秒发送超过 1 个传入的 webhook,你会得到 429 错误......所以我想我' d 需要使用一个队列,这样我就不会在同一秒内有 300 多个 lambda 表达式写入 Slack,而是在一个名为 slackQueue 的集中队列中控制从 AWS 到 Slack 的流量。
我的想法是将某些日志(见下文)从 Cloudwatch 发送到 SQS slackQueue,然后将此 SQS 队列用作 lambda 触发器并使用此 lambda 批次发送 10 条消息(AWS 允许的最大值;对于me 1 message= 1 console.log) 连接成一个大字符串或数组(无论什么)以将其发送到我的 Slack 频道(顺便说一句,您可以根据 Slack 限制连接并发送最多 100 条松弛消息,所以如果我可以处理 100 条消息=console.log 并连接我会,但我认为 AWS 的当前批量大小限制是 10),这样,确保我每秒发送的消息不超过 1 "request" 到 Slack (这个请求有10console.logs的内容)。
当我在上面说 "certain logs" 时,它的意思是,实际上我不希望将所有日志发送到队列(因为我不希望它们出现在 Slack 上):确实我不希望想要纯粹的 "debugging" 消息,例如 console.log("entered function foo").
,它们在开发过程中很有用,但与 Slack 无关。
关于一些评论:据我了解(不是 AWS 专家),我不想使用 cloudwatch 警报或指标过滤器,因为它们非常昂贵(我每次都会触发数百次小时)并且实际上不符合我的需要:我不想只在严重问题或 "problem" 发生时才在 Slack 上阅读(比如 CPU> xxx ...),但真的发送filtered 我所有日志的 "almost" 流到 Slack 以读取 Slack 内部而不是 AWS 内部的日志,因为 Slack 是整天打开的工具,它被用于 logs/messages 来自其他来源而不是 AWS 作为一个集中的地方,我们更好地消化了漂亮的 Slack 附件消息格式。当然,最后的 lambda(将消息发送到 slack 的那个)会进行一些格式化以添加 italic/bold/etc.,而 slack 需要 markdown 才能很好地格式化 "Slack attachements" 但这并不是最复杂的问题在这里 :)
@Mathieu,我猜你对 CloudWatch Events with CloudWatch logs 有一点误解。
您需要的是实时处理您的 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。