什么是传统负载均衡器的访问日志
什么是传统负载均衡器的Access Logs
Elastic Load Balancing 提供了Access Logs(访问日志),Access Logs可记录下发送到负载均衡器的请求的详细信息。每个日志都包含固定格式的信息 (例如,收到请求的时间、客户端的 IP 地址、延迟、请求路径和服务器响应)。可以使用这些日志分析流量模式和进行Debug。
Access Logs是ELB的一项可选功能,默认情况下是Disable的。启用后,ELB会将logs存储到指定的某个S3 Bucket中。
收费
ELB的Access Logs本身是不需要额外的费用的,从ELB传输到S3的流量是免费的,但是S3的存储费用是需要支付的。
可靠性
关于可靠性,官网文档中原话是”Elastic Load Balancing 将尽力记录请求。我们建议您使用访问日志来了解请求性质,而不是作为所有请求的完整描述”。
说明Access Logs不保证记录全部的请求,只能是作为流量分析的一个参考数据。
如何设置
首先需要一个S3 Bucket,并且配置为允许Elastic Load Balancing 的账户ID对Bucket进行写操作。其次配置ELB开启Access Logs并写入设置好的S3 Bucket中
设置S3
选择或创建一个S3 Bucket,切换到”Permission”的tab,选择”Bucket Policy”
添加Bucket Policy,此处测试用的Bucket carl-elb-logs是ap-northease-2(首尔)的Region,因此对应的ELB账户ID应该设置为600734575887
1234567891011121314151617{"Version": "2012-10-17","Statement": [{"Action": ["s3:PutObject"],"Effect": "Allow","Resource": "arn:aws:s3:::carl-elb-logs/*","Principal": {"AWS": ["600734575887"]}}]}每个Region的ELB账户ID是不一样的,如果是中国北京区,那就应该是638102146993,每个Region的ELB账户ID如下:
设置ELB Access Logs
在EC2 Console中,在左侧栏中找到Load Balancer, 然后选中要设置的ELB名字,此处为ELB-carl,切换到Description Tab。
在Attributes的Access logs下,点击Configure Access Logs
在弹出的Configure Access Logs页面中
- 选中Enable access logs
- Interval可选60 minutes或5 minutes
- 一般生产环境中选择60 minutes,减少S3中Access log文件的数量。
- 测试的时候选择5 minutes, 可以更快的查看到最新的access日志。
- S3 location中选择需要保存的S3 Bucket和prefix路径,此处因为是测试,就直接保存在S3 carl-elb-logs的根目录下。
- 如果prefix还没有创建,可以选择”Create this location for me”来自动让ELB创建对应的prefix
如果设置正确,就可以在步骤3中设置的S3 Bucket和prefix下看到一个名为AWSLogs/account_id/ELBAccessLogTestFile的测试文件,如果有这个文件,说明ELB和S3的设置正确了。
请求ELB的DNS,5分钟后,就可以在S3中看到access log了。
ELB的access log在S3中的文件名采用以下的格式
1bucket[/prefix]/AWSLogs/aws-account-id/elasticloadbalancing/region/yyyy/mm/dd/aws-account-id_elasticloadbalancing_region_load-balancer-name_end-time_ip-address_random-string.logaccess logs的文件内容采用如下的格式,包含了用户访问的数据和服务端响应的数据,可以根据某些字段来制作自己想要的数据报告。比如可以统计各个链接的访问数量,每个时间段内的访问数,统计各个HTTP Code的相应百分比,筛选5XX错误等
1timestamp elb client:port backend:port request_processing_time backend_processing_time response_processing_time elb_status_code backend_status_code received_bytes sent_bytes "request" "user_agent" ssl_cipher ssl_protocol
access log日志格式解析
Access log有TCP和HTTP,此处详细说明一下HTTP类别的日志格式
某条日志内容如下:
2017-12-24T09:13:07.059734Z ELB-carl 117.81.114.77:7169 172.31.13.115:80 0.000045 0.01808 0.000028 200 200 0 71015 “GET http://elb-carl-861166859.ap-northeast-2.elb.amazonaws.com:80/test.php HTTP/1.10” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36” - -
按照官网中文件格式的解析说明,每个字段分别的意思如下:
- 2017-12-24T09:13:07.059734Z 代表的是timestamp
- ELB-carl 代表的是elb,就是elb的名字
- 117.81.114.77代表的是client,就是客户端IP
- 7169代表的是client的port,就是客户端源端口
- 172.31.13.115代表的是backend,就是后端EC2的内网IP
- 80代表的是backend的port,就是后端EC2的端口
- 0.000045代表的是request_processing_time, 代表的是从ELB收到请求一直到将请求发送到后端EC2所用的总时间
- 0.01808代表的是backend_processing_time,代表的是从ELB将请求发送到后端EC2到该EC2开始发送响应标头所用的总时间
- 0.000028代表的是response_processing_time, 代表的是从ELB收到来自后端EC2的响应标头到开始向client发送响应所用的总时间。此时间包括在ELB上的排队时间以及从ELB到client的连接获取时间
- 第一个200代表的是elb_status_code, 表示来自ELB的响应的状态代码
- 第二个200代表的是backend_status_code, 表示来自后端EC2的响应的状态代码
- 0 代表的是received_bytes,表示从client (申请方) 接收的请求大小 (以字节为单位), 对于HTTP来说,包含请求正文,但不包括Header
- 71015 代表的是sent_bytes, 表示发送到client (申请方) 的响应的大小 (以字节为单位), 对于HTTP来说,包含响应正文,但不包括Header。
- “GET http://elb-carl-861166859.ap-northeast-2.elb.amazonaws.com:80/test.php HTTP/1.10”代表的是request,表示来自client的请求
- “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36”代表的是user_agent,就是浏览器的agent信息。
- 第一个“-”代表的是ssl_cipher,是ssl的cipher,如果是HTTP请求,就是“-”,如果是HTTPS的,那可能就是ECDHE-RSA-AES128-SHA
- 第二个“-”代表的是ssl_protocol,是ssl的协议。如果是HTTP请求,就是“-”,如果是HTTPS的,那可能是TLSv1或者TLSv1.2等。