【问题标题】:How to query AWS load balancer log if there are terabytes of logs?如果有 TB 的日志,如何查询 AWS 负载均衡器日志?
【发布时间】:2021-04-07 09:12:22
【问题描述】:

我想查询 AWS 负载均衡器日志以自动按计划为我发送报告。

我正在使用 Amazon Athena 和 AWS Lambda 来触发 Athena。我在这里根据指南创建了数据表:https://docs.aws.amazon.com/athena/latest/ug/application-load-balancer-logs.html

但是,我遇到以下问题:

  • 日志存储桶的大小每天都在增加。我注意到如果 Athena 查询需要超过 5 分钟才能返回结果,有时会产生“未知错误”
  • 因为 AWS Lambda 函数的最大超时时间仅为 15 分钟。因此,我不能继续增加 Lambda 函数超时等待 Athena 返回结果(例如,如果 Athena 需要 >15 分钟才能返回结果)

你们能为我推荐一些更好的解决方案来解决我的问题吗?我正在考虑使用 ELK 堆栈,但我没有使用 ELK 的经验,你能告诉我 ELK 与组合:AWS Lambda + AWS Athena 相比的优缺点吗?谢谢!

【问题讨论】:

  • 看来你正在处理大数据问题,所以必须使用工具。也许 AWS EMR 会有所帮助?
  • 您需要在整个日志历史记录中运行查询,还是仅针对过去几天/几周运行查询?
  • @Parsifal 目前,我按年运行。我认为上个月/几周也可以。但是,我创建了类似于指南中的步骤的表格,我在帖子中引用了链接。而且我认为如果我设置 s3 位置就像 /region/year/month 一样。比如第3个月的数据要倒进我的数据表中,到了第4个月的时候,表数据就会不正确。我必须重新创建我的数据表吗?你对我有什么建议吗?

标签: amazon-web-services amazon-athena


【解决方案1】:

首先,您不需要在 Athena 查询执行时保持 Lambda 运行。 StartQueryExecution 返回一个查询标识符,然后您可以使用 GetQueryExecution 轮询该标识符以确定查询何时完成。

当然,如果您将查询作为 Web 请求的一部分来调用,那效果就不太好了,但我建议您不要这样做。而且,不幸的是,我没有看到 Athena 与 CloudWatch Events 相关联,因此您必须轮询查询是否完成。

除此之外,从 Athena 读取访问日志的问题在于,对它们进行分区并不容易。 AWS 提供的 example 定义了 Athena 内部的表,默认分区方案使用具有段 /column=value/ 的 S3 路径。但是,ALB 访问日志使用更简单的yyyy/mm/dd 分区方案。

如果您使用 AWS Glue,您可以define a table format 使用这种更简单的方案。我还没有这样做,所以除了文档中的内容之外,无法为您提供信息。

另一种选择是限制存储桶中的数据量。这可以节省存储成本并减少查询时间。我会做如下的事情:

  • Bucket_A 是访问日志的目的地,也是您的 Athena 查询的来源。它有一个生命周期策略,会在 30(或 45 或其他)天后删除日志。
  • Bucket_B 设置为从 Bucket_A 复制日志(这样您就可以永久保留所有内容)。它会立即将所有复制的文件转移到“不经常访问”的存储中,从而将成本降低一半。

Elasticsearch 无疑是一个受欢迎的选择。您需要转换文件才能上传。我没看过,但我确信有一个 Logstash 插件可以做到这一点。根据您对报告的要求,Elasticsearch 可能比 Athena 更好或更差。

【讨论】:

    猜你喜欢
    • 2022-06-29
    • 2020-03-09
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2019-11-26
    • 1970-01-01
    相关资源
    最近更新 更多