如何使用 Athena 分析 Application Load Balancer 访问日志?

上次更新时间:2020 年 10 月 29 日

我想要分析自己的 Application Load Balancer 访问日志。如何使用 Amazon Athena 执行此操作?

简短描述

默认情况下,Elastic Load Balancing 不启用访问日志记录。您在启用访问日志记录时,需要指定一个 Amazon Simple Storage Service (Amazon S3) 存储桶。所有 Application Load Balancer 和 Classic Load Balancer 访问日志都存储在该 S3 存储桶中。您希望进行问题排查或分析负载均衡器的性能时,可以使用 Athena 分析 S3 中的访问日志。

注意:虽然您可以使用 Athena 分析 Application Load Balancer 和 Classic Load Balancer 的访问日志,但此处仅介绍了 Application Load Balancer。

解决方法

要在 Athena 中分析访问日志,请创建数据库和表:

1.     打开 Athena 控制台

2.     在查询编辑器中,运行类似如下的命令以创建数据库。最佳实践是在 S3 存储桶所在的 AWS 区域创建数据库。

create database alb_db

3.     在您在此前的步骤中创建的数据库中,为 ALB 日志创建表

4.     在左侧窗格中的下,从表名称旁边的菜单按钮中选择预览表结果窗口中会显示 ALB 访问日志中的数据。

5.    使用查询编辑器,对表运行 SQL 语句。您可以保存查询、查看以前的查询或下载 CSV 格式的查询结果。

示例查询

在以下示例中,alb_log 为表名称。修改表名称、列值和其他变量以适合您的查询。

操作 查询

按时间顺序查看前 100 个访问日志条目。

使用案例:分析和问题排查

SELECT *
FROM alb_log
ORDER by time ASC
LIMIT 100;

列出所有已访问 Application Load Balancer 的客户端 IP 地址,以及它们访问 Application Load Balancer 的次数。

使用案例:分析和问题排查

SELECT distinct client_ip, count() as count from alb_log
GROUP by client_ip
ORDER by count() DESC;

列出请求/响应对中通过 Application Load Balancer 传输的平均数据量(以 KB 为单位)。

使用案例:分析和问题排查

SELECT (avg(sent_bytes)/1000.0 + avg(received_bytes)/1000.0)
as prewarm_kilobytes from alb_log;

列出 Application Load Balancer 将流量路由到的所有目标,以及 Application Load Balancer 按百分比分配形式,将请求路由到每个目标的次数。

使用案例:识别潜在的目标流量不平衡

SELECT target_ip, (Count(target_ip)* 100.0 / (Select Count(*) From alb_log))
as backend_traffic_percentage
FROM alb_log
GROUP by target_ip
ORDER By count() DESC;

列出客户端将请求发送到 Application Load Balancer,然后在空闲超时过期时间前终止与 Application Load Balancer 连接的次数(HTTP 460 错误)。

使用案例:纠正 HTTP 460 错误

SELECT * from alb_log where elb_status_code = '460'

列出因侦听器规则将请求转发给空的目标组而无法路由客户端请求的次数(HTTP 503 错误)。

使用案例:纠正 HTTP 503 错误

SELECT * from alb_log where elb_status_code = '503'

按照每个客户端访问指定 URL 的次数以降序顺序列出客户端。

使用案例:分析流量模式

SELECT client_ip, elb, request_url, count(*) as count from alb_log
GROUP by client_ip, elb, request_url
ORDER by count DESC;

按降序顺序列出 Firefox 用户最频繁访问的 10 个 URL。

使用案例:分析流量分配和模式

SELECT request_url, user_agent, count(*) as count
FROM alb_log
WHERE user_agent LIKE '%Firefox%'
GROUP by request_url, user_agent
ORDER by count(*) DESC
LIMIT 10;

按照每个客户端发送给 Application Load Balancer 的请求中包含的数据量(以 MB 为单位),以降序顺序列出客户端。

使用案例:分析流量分配和模式

SELECT client_ip, sum(received_bytes/1000000.0) as client_datareceived_megabytes
FROM alb_log
GROUP by client_ip
ORDER by client_datareceived_megabytes DESC;

列出指定日期范围内每次目标处理时间超过 5 秒的时间。

使用案例:解决指定的时间范围内的延迟问题

SELECT * from alb_log
WHERE (parse_datetime(time,'yyyy-MM-dd''T''HH:mm:ss.SSSSSS''Z')
     BETWEEN parse_datetime('2018-08-08-00:00:00','yyyy-MM-dd-HH:mm:ss')
     AND parse_datetime('2018-08-08-02:00:00','yyyy-MM-dd-HH:mm:ss'))
AND (target_processing_time >= 5.0)


这篇文章对您有帮助吗?


您是否需要账单或技术支持?