如何使用 Amazon Athena 分析我的应用程序负载均衡器访问日志?

4 分钟阅读
0

我想使用 Amazon Athena 分析我的应用程序负载均衡器访问日志。

我想使用 Amazon Athena 分析我的应用程序负载均衡器访问日志。

简短描述

默认情况下,弹性负载均衡不会启用访问日志。当您激活访问日志记录时,需要指定一个 Amazon Simple Storage Service(Amazon S3)桶。所有应用程序负载均衡器和经典负载均衡器访问日志都会存储在 Amazon S3 桶中。要对负载均衡器的性能进行故障排除或分析,请使用 Athena 分析 Amazon S3 中的访问日志。

**注意:**尽管您可以使用 Athena 分析应用程序负载均衡器和经典负载均衡器的访问日志,但此解决方法仅适用于应用程序负载均衡器

解决方法

为应用程序负载均衡器日志创建数据库和表

要在 Athena 中分析访问日志,请按照以下步骤创建数据库和表:

1.    打开 Athena 控制台

2.    要创建数据库,请在查询编辑器中运行以下命令。最佳做法是在与 S3 桶相同的 AWS 区域中创建数据库。

create database alb_db

3.    在第 2 步中创建的数据库中,为应用程序负载均衡器日志创建 alb_logs 表。有关详细信息,请参阅为应用程序负载均衡器日志创建表

**注意:**为了提高查询性能,您可以创建带有分区投影的表。在分区投影中,Athena 会从配置中计算分区值和位置,而不是从存储库(例如 AWS Glue Data Catalog)中读取。有关详细信息,请参阅使用 Amazon Athena 进行分区投影

CREATE EXTERNAL TABLE IF NOT EXISTS alb_logs (
            type string,
            time string,
            elb string,
            client_ip string,
            client_port int,
            target_ip string,
            target_port int,
            request_processing_time double,
            target_processing_time double,
            response_processing_time double,
            elb_status_code int,
            target_status_code string,
            received_bytes bigint,
            sent_bytes bigint,
            request_verb string,
            request_url string,
            request_proto string,
            user_agent string,
            ssl_cipher string,
            ssl_protocol string,
            target_group_arn string,
            trace_id string,
            domain_name string,
            chosen_cert_arn string,
            matched_rule_priority string,
            request_creation_time string,
            actions_executed string,
            redirect_url string,
            lambda_error_reason string,
            target_port_list string,
            target_status_code_list string,
            classification string,
            classification_reason string
            )
            PARTITIONED BY
            (
             day STRING
            )
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' =
            '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) (.*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-_]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^\s]+?)\" \"([^\s]+)\" \"([^ ]*)\" \"([^ ]*)\"')
            LOCATION 's3://your-alb-logs-directory/AWSLogs/1111222233334444/elasticloadbalancing//'
            TBLPROPERTIES
            (
             "projection.enabled" = "true",
             "projection.day.type" = "date",
             "projection.day.range" = "2022/01/01,NOW",
             "projection.day.format" = "yyyy/MM/dd",
             "projection.day.interval" = "1",
             "projection.day.interval.unit" = "DAYS",
             "storage.location.template" = "s3://your-alb-logs-directory/AWSLogs/1111222233334444/elasticloadbalancing//${day}"
            )

**注意:**请根据您的用例替换表名和 S3 位置。

或者,使用以下查询创建带分区的表:

CREATE EXTERNAL TABLE IF NOT EXISTS alb_logs_partitioned (
            type string,
            time string,
            elb string,
            client_ip string,
            client_port int,
            target_ip string,
            target_port int,
            request_processing_time double,
            target_processing_time double,
            response_processing_time double,
            elb_status_code string,
            target_status_code string,
            received_bytes bigint,
            sent_bytes bigint,
            request_verb string,
            request_url string,
            request_proto string,
            user_agent string,
            ssl_cipher string,
            ssl_protocol string,
            target_group_arn string,
            trace_id string,
            domain_name string,
            chosen_cert_arn string,
            matched_rule_priority string,
            request_creation_time string,
            actions_executed string,
            redirect_url string,
            lambda_error_reason string,
            target_port_list string,
            target_status_code_list string,
            classification string,
            classification_reason string
            )
            PARTITIONED BY(day string)
            ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
            WITH SERDEPROPERTIES (
            'serialization.format' = '1',
            'input.regex' =
            '([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*):([0-9]*) ([^ ]*)[:-]([0-9]*) ([-.0-9]*) ([-.0-9]*) ([-.0-9]*) (|[-0-9]*) (-|[-0-9]*) ([-0-9]*) ([-0-9]*) \"([^ ]*) ([^ ]*) (- |[^ ]*)\" \"([^\"]*)\" ([A-Z0-9-]+) ([A-Za-z0-9.-]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^\"]*)\" ([-.0-9]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\" \"([^ ]*)\" \"([^\s]+?)\" \"([^\s]+)\" \"([^ ]*)\" \"([^ ]*)\"')
            LOCATION 's3://my_log_bucket/AWSLogs/1111222233334444/elasticloadbalancing/us-east-1/'

然后,使用 ALTER TABLE ADD PARTITION 命令加载分区:

ALTER TABLE alb_logs_partitioned ADD
  PARTITION (day = '2022/05/21')
  LOCATION's3://my_log_bucket/AWSLogs/1111222233334444/elasticloadbalancing/us-east-1/2022/05/21/'

**注意:**在应用程序负载均衡器日志上使用 AWS Glue 爬网程序并非最佳做法。

4.    在导航窗格中的 Tables(表)下,从菜单中选择 Preview table(预览表)。您可以在 Results(结果)窗口中查看应用程序负载均衡器访问日志中的数据。

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

查询示例

在以下示例中,请务必修改表名、列值和其他变量以符合您的查询:

按时间顺序查看前 100 个访问日志记录

使用此查询进行分析和故障排除:

SELECT *  
FROM alb_logs  
ORDER by time ASC  
LIMIT 100

列出访问了应用程序负载均衡器的所有客户端 IP 地址,以及他们访问应用程序负载均衡器的次数

使用此查询进行分析和故障排除:

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

列出在请求或响应对中通过应用程序负载均衡器的平均数据量(以 KB 为单位)

使用此查询进行分析和故障排除:

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

按百分比分配列出应用程序负载均衡器将流量路由到的所有目标以及每个目标路由的请求数

使用此查询来确定潜在的目标流量失衡:

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

列出客户端向应用程序负载均衡器发送请求然后在空闲超时结束之前关闭了连接的次数(HTTP 460 错误)

使用此查询来排查 HTTP 460 错误:

SELECT * from alb_logs where elb_status_code = '460';

列出由于侦听器规则将请求转发到空目标组而未路由客户端请求的次数(HTTP 503 错误)

使用此查询来排查 HTTP 503 错误:

SELECT * from alb_logs where elb_status_code = '503';

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

使用此查询分析流量模式:

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

按降序列出 Firefox 用户最常访问的 10 个 URL

使用此查询分析流量分配和模式:

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

按每个客户端向应用程序负载均衡器发送请求的数据量(以 MB 为单位)降序列出客户端

使用此查询分析流量分配和模式:

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

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

使用此查询来排除指定时间范围内的延迟问题:

SELECT * from alb_logs  
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);

计算按客户端 IP 地址分组的负载均衡器收到的 HTTP GET 请求数

使用此查询分析进入流量分配:

SELECT COUNT(request_verb)   
AS count, request_verb, client_ip   
FROM alb_logs_partitioned   
WHERE day = '2022/05/21'   
GROUP by request_verb, client_ip;
AWS 官方
AWS 官方已更新 1 年前