一、排查思路
遇到网站访问错误,例如网站报告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将字直接收益。