使用Athena的排查ELB后的网站错误

一、排查思路

遇到网站访问错误,例如网站报告504错误,建议分段排查。如果网站有多个服务商组成,例如在AWS之前使用了CDN、WAF等,这需要分段排查。思路如下。

1、分段排查,分成 域名解析 -> 第三方WAF -> AWS ELB -> AWS EC2 几段。

2、各段打开LOG,根据LOG报错排查。

为了方便调查,这里将使用AWS Athena快速检索网站日志。

二、打开ELB上的LOG

登陆到AWS Console,进入EC2服务,在左侧点击负载均衡器按钮。然后点击编辑,启用日志。

ELB的日志是自动保存到S3对象存储的某一个Bucket的。如果此bucket不存在,这输入了名字,会自动建立起来。

Elastic Load Balancing (ELB)的日志包含信息收到请求的时间、客户端的 IP 地址、延迟、请求路径和服务器响应等信息,可以使用这些访问日志分析流量模式并解决问题。

生成日志功能,默认是禁用的。启用日志后,以5 分钟为见间隔,每个负载均衡器节点发布一次日志文件。因此新打开日志后,要过一阵才有日志第一次生成。日志传输最终是一致的。负载均衡器可以传输相同时间段的多个日志。通常,如果站点具有高流量,会出现此情况。

例如,运行了一段时间之后,有如下日志在S3 Bucket内生成。

三、日志格式说明

字段较多,请参考如下网址的完整说明。点击这里跳转。

四、日志中错误代码

请看如下日志。如下截图中,红色框中代表的是HTTP返回Code,200表示成功。第一个代码200表示客户端到ELB访问成功,第二个200表示ELB到EC2服务器访问成功。然后两个200数字后边的两个数字,表示收到数据包的字节数和发送数据包的字节数。再下一个就是完整的请求完整,以HTTP的GET方法开头,后边是完整地址。

因此,查找错误请搜索这里有无5开头的数字,例如504等错误代码。
如果访问量比较大,那么在S3的这个bucket下会生成大量文件,就不方便逐个解压缩排查了。接下来需要用Athena在S3上直接查询。

五、使用AWS Athena检索日志

Amazon Athena 是一种交互式查询服务,让您能够使用标准 SQL 直接在 Amazon Simple Storage Service (Amazon S3) 中轻松分析数据。只需在 AWS 管理控制台中执行几项操作,即可将 Athena 指向 Amazon S3 中存储的数据,并开始使用标准 SQL 运行临时查询,然后在几秒钟内获得结果。

用Athena查询ELB的访问日志的方法文档详细描述。本文接下来的部分是对这个文档的一个精简和友好化的表述。

首先,在对应的区域,进入Athena产品页面。如下截图。

在上图中,点击Get Started开始。接下来会出现一个向导,提示建立Athena库。

这个向导,实际上是不需要的配置较为不方便,稍后我们会走SQL命令一次性把表建立起来。因此,点击取消退出这个向导。

接下来,点击左侧的Database,然后再右边输入如下SQL代码建立数据库。

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 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,
            new_field 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]*) ([^ ]*) \"([^\"]*)\" \"([^\"]*)\"($| \"[^ ]*\")(.*)')
            LOCATION 's3://your-alb-logs-directory/AWSLogs/<ACCOUNT-ID>/elasticloadbalancing/<REGION>/';

在如上这一段代码里边,上半部分数据库表格的结构都是高度结构化的,与ELB导出到S3的日志完全一种,不需要修改。最后一行,location部分,请修改为ELB导出对应的S3路径。注意要输入Bucket名、账户名、Region等,而S3 Bucket里边实际还有日期等目录结构是不用输入的。

输入完成后如下图。

建立表格结构成功后,现在来查询数据。以下命令表示统计所有HTTP Code为特定值的访问。

SELECT count(request_url)
FROM alb_logs
WHERE elb_status_code = '504'

如此就实现了对大量Log的快速查询,统计获得504失败的次数。

在上图中,如此就实现了直接在ELB输出的HTTP访问日志上,使用SQL快速查询数据。可根据需要查询需要排错的敏感错误代码,并用于分析排错。

如果需要查询其他报错信息,或者打印出来具体的错误URL,可以需改如上SQL,不使用count计数,而是select出来,就可以获得单次访问报告504错误的URL。

六、小结

S3在AWS产品中有这越来越重要的定位,是构建企业数据湖的核心,包括Kinesis在哪的多款产品都支持将数据直接导入S3。S3在大数据、物联网将发挥出越来越重要的作用,用好S3将字直接收益。